XSLT 2.0父子节点具有相同的命名空间

时间:2014-05-09 07:45:19

标签: xml xslt xml-namespaces

源XML:

<books xmlns="www.flipkart.com" xmlns:sport="www.flipkart.com/sports">
    <book xmlns:sport="www.flipkart.com/sports" xmlns:bio="www.flipkart.com/sports/bio">
        <name>Open</name>
        <author>Agassi</author>
    </book>
    <book xmlns:sport="www.flipkart.com/sports" xmlns:bio="www.flipkart.com/sports/bio">
        <name>Bounce</name>
        <author>Matthew Syed</author>
    </book>
</books>

XSLT:

复制源xml而不做任何更改

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
    <xsl:template match="/">

        <xsl:copy-of  select="/"/>

    </xsl:template>  
</xsl:stylesheet>

输出:

父和子之间的公共命名空间不会出现

<books xmlns="www.flipkart.com" xmlns:sport="www.flipkart.com/sports">
    <book xmlns:bio="www.flipkart.com/sports/bio">
        <name>Open</name>
        <author>Agassi</author>
    </book>
    <book xmlns:bio="www.flipkart.com/sports/bio">
        <name>Bounce</name>
        <author>Matthew Syed</author>
    </book>
</books>

我想要的行为是复制源xml而没有任何改变。转换后的常用命名空间(xmlns:sport =&#34; www.flipkart.com/sports")在父级&#34;书籍&#34;之间。和孩子&#34;书&#34;没有出现在输出

预期:

<book xmlns:sport="www.flipkart.com/sports" xmlns:bio="www.flipkart.com/sports/bio">

实际值:

<book xmlns:bio="www.flipkart.com/sports/bio">

如何在输出中包含子命名空间?

由于

2 个答案:

答案 0 :(得分:2)

XSLT / XQuery / XPath数据模型不允许您区分

<foo xmlns:pf="http://example.com/"><bar>...</bar></foo>

<foo xmlns:pf="http://example.com/"><bar xmlns:pf="http://example.com/">...</bar></foo>

如果需要区分这些情况,则需要查看DOM,其中命名空间声明被建模为属性,但您当然还需要查找或编写DOM树的序列化程序,以确保任何名称空间声明属性都被序列化

答案 1 :(得分:1)

你不是在谈论&#34;子命名空间&#34;但关于命名空间声明,它在源文档中包含三次 - 并且不在任何地方使用。在这些情况下,处理器可能决定执行以下任一操作:

  1. 按原样复制声明的所有实例;
  2. 留下声明的一个实例并删除后续的重复声明;
  3. 完全删除声明的所有实例。
  4. 所有这些行动都是&#34;正确&#34;。

      

    我想要的行为是复制源xml,没有任何改变。

    为什么要进行转型呢?