سؤال

لدي مستند XML يحتوي على عناصر غير ذات مساحة أسماء، وأريد استخدام XSLT لإضافة مساحات أسماء إليها.ستكون معظم العناصر في مساحة الاسم A؛سيكون عدد قليل منها في مساحة الاسم B.كيف أقوم بهذا العمل؟

هل كانت مفيدة؟

المحلول

مع foo.xml

<foo x="1">
    <bar y="2">
        <baz z="3"/>
    </bar>
    <a-special-element n="8"/>
</foo>

و foo.xsl

    <xsl:template match="*">
        <xsl:element name="{local-name()}" namespace="A" >
            <xsl:copy-of select="attribute::*"/>
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>

    <xsl:template match="a-special-element">
        <B:a-special-element xmlns:B="B">
            <xsl:apply-templates match="children()"/>
        </B:a-special-element>
    </xsl:template>

</xsl:transform>

انا حصلت

<foo xmlns="A" x="1">
    <bar y="2">
        <baz z="3"/>
    </bar>
    <B:a-special-element xmlns:B="B"/>
</foo>

هل هذا ما تبحث عنه؟

نصائح أخرى

سوف تحتاج إلى مكونين رئيسيين لهذه الوصفة.

سيكون مخزون الصلصة هو تحويل الهوية, ، وسيتم إعطاء النكهة الرئيسية بواسطة namespace يعزو إلى xsl:element.

يجب أن تضيف التعليمات البرمجية التالية، التي لم يتم اختبارها، ملف http://example.com/ مساحة الاسم لجميع العناصر.

<xsl:template match="*">
  <xsl:element name="xmpl:{local-name()}" namespace="http://example.com/">
    <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
</xsl:template>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

رسالة شخصية:مرحبًا جيني تينيسون.أعلم أنك تقرأ هذا.

إليك ما لدي حتى الآن:

<xsl:template match="*">
    <xsl:element name="{local-name()}" namespace="A" >
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>

<xsl:template match="a-special-element">
    <B:a-special-element xmlns:B="B">
      <xsl:apply-templates />
    </B:a-special-element>
</xsl:template>

هذا يعمل تقريبا.المشكلة هي أنه لا ينسخ السمات.مما قرأته حتى الآن، لا يحتوي xsl:element على طريقة لنسخ جميع السمات من العنصر كما هو (يبدو أن مجموعات use-attribute-sets لا تقطعها).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top