XLST不忽略名称空间前缀

时间:2017-11-16 14:01:15

标签: xml xslt namespaces

我有以下xmldata输入,应该通过xslt进行转换。 我只想提取ns:内容。 dynamicNS命名空间在运行时可能不同。

<?xml version="1.0"?>
<dynamicNS:header>
  <ns:something>
    <ns:myid>1</ns:myid>
    <ns:myvalue>2</ns:myvalue>
  </ns:something>
</dynamicNS:header>

输出应为:

<?xml version="1.0"?>
  <ns:something>
    <ns:myid>1</ns:myid>
    <ns:myvalue>2</ns:myvalue>
  </ns:something>

我尝试过:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="*">
      <ns:something>
          <xsl:copy-of select="node()"/>
      </ns:something>
    </xsl:template>

</xsl:stylesheet>

但是这给了我错误:元素“dynamicNS:header”的前缀“dynamicNS”没有绑定。

我不想为dynamicNS添加命名空间,因为每次运行都可能有所不同。

获得所需输出的正确方法是什么?

谢谢你们。

1 个答案:

答案 0 :(得分:0)

如果要省略根元素及其名称空间声明,只复制其子元素,那么在XSLT 2及更高版本中,您可以使用

    

制作根目录的所有子元素的副本,例如输入

<dynamicNS:header xmlns:dynamicNS="http://example.com/foo">
  <ns:something xmlns:ns="http://example.com/ns">
    <ns:myid>1</ns:myid>
    <ns:myvalue>2</ns:myvalue>
  </ns:something>
</dynamicNS:header>

转换为结果

<ns:something xmlns:ns="http://example.com/ns">
    <ns:myid>1</ns:myid>
    <ns:myvalue>2</ns:myvalue>
  </ns:something>

http://xsltransform.hikmatu.com/gWcDMee

正如我在评论中已经说过的,XSLT的输入和样式表代码都需要是名称空间格式良好的XML文档,因此您在问题中发布的输入和输出带有前缀,而没有名称空间声明存在不允许进行XSLT处理。