【问题标题】:Remove XML namespaces in all nodes but the root node删除除根节点之外的所有节点中的 XML 命名空间
【发布时间】:2017-05-19 11:42:28
【问题描述】:

我想删除所有节点中的命名空间,但将命名空间留在根节点中。

你知道我该怎么做吗?

我正在使用这个 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:element name="{local-name()}" >
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

提前致谢。

【问题讨论】:

  • 只要确保这里...您想将根元素保留在同一个命名空间中,并为所有后代提供默认(空)命名空间吗?我之所以问,是因为有时人们只想在根元素中声明所有命名空间,但将后代留在其原始命名空间中(没有重复或冗余的前缀绑定)。
  • 是的,想法是将根元素保持在同一个命名空间中,并给所有后代一个空命名空间。
  • 请提供输入和预期输出的示例。
  • 我们需要删除除根节点之外的所有节点中的命名空间。但是我们需要保留前缀。在此图像中,您有一个示例。谢谢
  • 这是带有示例i64.tinypic.com/1zyy4c4.jpg的图像

标签: xml xslt xml-namespaces


【解决方案1】:

将元素保留在其命名空间中的简单方法是复制它:

<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-stripped 文档中使用。我仍然认为在 XSL 中显式声明根命名空间是一种更简洁的选择。
  • 我(在某种程度上)同意第一部分,但不同意第二部分。让 OP 生成一个输入示例。
  • 谢谢,一切正常。但这是删除所有子节点中的命名空间......我认为这是我们需要的,但我们需要在所有节点中保留前缀。仅删除 URL。是否可以?谢谢
  • @Richal 它正在做你所要求的:“我想删除所有节点中的命名空间,但将命名空间留在根节点中。”如果你想要别的东西,我建议你发布一个新问题,并确保包括一个输入和预期输出的例子。请注意,如果不将前缀绑定到命名空间 URI,则不能使用前缀。
【解决方案2】:

您的第一种方法对我来说似乎非常适合。你只需要:

  • 添加一个模板来匹配根节点,它不会丢弃命名空间:

<xsl:template match="/*"> <xsl:element name="{name()}" > <xsl:apply-templates select="@* | node()"/> </xsl:element> </xsl:template>

  • 在 XSL 中包含根命名空间定义:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rootns="..." >

【讨论】:

  • 你假设根元素有一个前缀。即便如此,也有更简单的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多