使用xslt2.0添加命名空间

时间:2017-05-31 04:45:49

标签: xslt namespaces xslt-2.0

互联网上有很多引用与我有同样的问题。这是添加命名空间,我和我看到的相同:Adding namespace in inner parent group in xslt v2.0。但就我而言,我在父标记中没有名称空间,并在内部级别组中插入名称空间。我试图复制解决方案,但我无法获得预期的输出。例如,我有这个示例文件

INPUT:

<Record>
 <Data>
   <Section>
     <ID>111222</ID>
   </Section>
 </Data>
</Record>

预期:

<Record>
 <Data>
   <Section xmlns="www.hdgd.co">
     <ID>111222</ID>
   </Section>
 </Data>
</Record>

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="Section">
    <Section xmlns="www.hdgd.co">
        <xsl:copy-of select="*"/>
    </Section>
</xsl:template>

生成的输出在ID元素中填充了一个空命名空间。而且,我需要删除那些空的xmlns。看起来像这样:

    <Record>
 <Data>
   <Section xmlns="www.hdgd.co">
     <ID xmlns="">111222</ID>
   </Section>
 </Data>
</Record>

1 个答案:

答案 0 :(得分:1)

你不能使用:

<xsl:copy-of select="*"/>

因为它将子节点复制到其原始命名空间 - 这是无命名空间。要获得所需的结果,您不仅必须将Section移动到新命名空间,还要移动所有后代(并保留所有其他节点) - 例如:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="*[ancestor-or-self::Section]">
    <xsl:element name="{name()}" namespace="www.hdgd.co">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>