除去根节点以外的所有节点中的XML命名空间
我想删除所有节点中的名称空间,但将名称空间保留在根节点中 你知道我怎么做吗 我正在使用这个XSLT,但它正在删除所有节点中的名称空间除去根节点以外的所有节点中的XML命名空间,xml,xslt,xml-namespaces,Xml,Xslt,Xml Namespaces,我想删除所有节点中的名称空间,但将名称空间保留在根节点中 你知道我怎么做吗 我正在使用这个XSLT,但它正在删除所有节点中的名称空间 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" version="1.0" encoding="UTF-8" /> <xsl:template match="*">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" version="1.0" encoding="UTF-8" />
<xsl:template match="*">
<xsl:element name="{local-name()}" >
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
提前谢谢。你的第一个方法对我来说似乎很有针对性。你只需要:
- 添加一个模板以匹配根节点,它不会从命名空间中删除:
- 在XSL中包含根命名空间定义:
将元素保留在其命名空间中的简单方法是复制它:
<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="*"/>
<!-- remove namespaces -->
<xsl:template match="*">
<xsl:element name="{local-name()}" >
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- keep namespace of root element -->
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请注意,这不处理属性(您的版本也不处理属性)。请确保此处。。。是否要将根元素保留在同一名称空间中,并为所有后代提供默认(空)名称空间?我这样问是因为有时人们只想在根元素中声明所有名称空间,但将子体保留在其原始名称空间中(没有重复或冗余的前缀绑定)。是的,想法是将根元素保留在同一名称空间中,并为所有子体提供一个空名称空间。请提供输入和预期输出的示例。我们需要删除除根节点以外的所有节点中的名称空间。但是我们需要保留前缀。在这幅图中,你有一个例子。感谢这是一张图片,上面的示例假设根元素有一个前缀。即使这样,还有一种更简单的方法,盲目复制整个根节点可能会产生额外的名称空间声明,而这些声明不会在最终的ns剥离文档中使用。我仍然认为在XSL中显式声明根命名空间是一个更干净的选择。我(多少)同意第一部分,但不同意第二部分。让OP生成一个输入示例。谢谢,这很好。但这是在删除所有子节点中的名称空间。。。我认为这是我们需要的,但我们需要在所有节点中保留prexif。仅删除URL。可能吗?Thanks@Richal它正按照您的要求执行:“我希望删除所有节点中的名称空间,但将名称空间保留在根节点中。”如果您还需要其他内容,我建议您发布一个新问题,并确保包含输入和预期输出的示例。请注意,如果不将前缀绑定到命名空间URI,则不能使用前缀。