Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除去根节点以外的所有节点中的XML命名空间_Xml_Xslt_Xml Namespaces - Fatal编程技术网

除去根节点以外的所有节点中的XML命名空间

除去根节点以外的所有节点中的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="*">

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

你知道我怎么做吗

我正在使用这个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>


提前谢谢。

你的第一个方法对我来说似乎很有针对性。你只需要:

  • 添加一个模板以匹配根节点,它不会从命名空间中删除:

  • 在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,则不能使用前缀。