我需要从元素中删除前缀
我有这个XML
<ns:order xmlns:ns="namespace">
<row>
<id>1</id>
</row>
<row>
<id>2</id>
</row>
</ns:order>
我收到了这封电子邮件,但结果出乎我的意料,因为第二个元素也获得了前缀。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:variable name="topNode" select="name(/*)"/>
<xsl:variable name="topNodeNamespace" select="namespace-uri(/*)"/>
<xsl:template match="/">
<xsl:element name="{$topNode}" namespace="{$topNodeNamespace}">
<xsl:copy-of select="node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这是运行xsl后得到的:
<?xml version="1.0" encoding="UTF-8"?>
<ns:order xmlns:ns="namespace">
<ns:order>
<row>
<id>1</id>
</row>
<row>
<id>2</id>
</row>
</ns:order>
</ns:order>
我想要这个:
<?xml version="1.0" encoding="UTF-8"?>
<ns:order xmlns:ns="namespace">
<order>
<row>
<id>1</id>
</row>
<row>
<id>2</id>
</row>
</order>
</ns:order>
答案 0 :(得分:1)
您当前正在尝试添加一个新元素作为当前元素的父元素。如果您添加了一个新子代并将其添加到现有子代中,那将更有意义。
尝试使用此XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:variable name="topNode" select="local-name(/*)"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:element name="{$topNode}">
<xsl:copy-of select="node()"/>
</xsl:element>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
或者,不使用变量。...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/*">
<xsl:copy>
<xsl:element name="{local-name()}">
<xsl:copy-of select="node()"/>
</xsl:element>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请注意,使用local-name()
代替name()
是因为local-name()
将不包含任何前缀。