互联网上有很多引用与我有同样的问题。这是添加命名空间,我和我看到的相同: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>
答案 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>