Add a namespace to elements

前端 未结 3 666
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-11 02:56

I have an XML document with un-namespaced elements, and I want to use XSLT to add namespaces to them. Most elements will be in namespace A; a few will be in namespace B. How

相关标签:
3条回答
  • 2020-12-11 03:03

    With foo.xml

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

    and 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>
    

    I get

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

    Is that what you’re looking for?

    0 讨论(0)
  • 2020-12-11 03:03

    Here's what I have so far:

    <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>
    

    This almost works; the problem is that it's not copying attributes. From what I've read thusfar, xsl:element doesn't have a way to copy all of the attributes from the element as-is (use-attribute-sets doesn't appear to cut it).

    0 讨论(0)
  • 2020-12-11 03:04

    You will need two main ingredients for this recipe.

    The sauce stock will be the identity transform, and the main flavor will be given by the namespace attribute to xsl:element.

    The following, untested code, should add the http://example.com/ namespace to all elements.

    <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>
    

    Personal message: Hello, Jeni Tennison. I know you are reading this.

    0 讨论(0)
提交回复
热议问题