Xml 子节点中的命名空间为空

Xml 子节点中的命名空间为空,xml,xslt,Xml,Xslt,使用固定名称空间时,输出是正确的 XSLT: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:output method="xml"/> <xsl:template match="/NewDataSet"> <F

使用固定名称空间时,输出是正确的

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml"/>
    <xsl:template match="/NewDataSet">
        <Foo namespace="http://MyLink/FixedVersion">
            <Bar>
                <SomeData/>
            </Bar>
        </Foo>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<Foo namespace="http://MyLink/FixedVersion">
    <Bar>
        <SomeData />
    </Bar>
</Foo>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml"/>
    <xsl:template match="/NewDataSet">
        <xsl:element name="Foo" namespace="http://MyLink/{Table/version}">
            <Bar>
                <SomeData/>
            </Bar>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns="http://MyLink/v02_04_01">
    <Bar xmlns="">
        <SomeData />
    </Bar>
</Foo>
<?xml version="1.0"?>
<Foo xmlns="http://MyLink/v02_04_01">
    <Bar>
        <SomeData/>
    </Bar>
</Foo>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml"/>
    <xsl:template match="/NewDataSet">
        <Foo namespace="http://MyLink/FixedVersion">
            <Bar>
                <SomeData/>
            </Bar>
        </Foo>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<Foo namespace="http://MyLink/FixedVersion">
    <Bar>
        <SomeData />
    </Bar>
</Foo>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml"/>
    <xsl:template match="/NewDataSet">
        <xsl:element name="Foo" namespace="http://MyLink/{Table/version}">
            <Bar>
                <SomeData/>
            </Bar>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns="http://MyLink/v02_04_01">
    <Bar xmlns="">
        <SomeData />
    </Bar>
</Foo>
<?xml version="1.0"?>
<Foo xmlns="http://MyLink/v02_04_01">
    <Bar>
        <SomeData/>
    </Bar>
</Foo>

使用动态命名空间时,子节点命名空间中的命名空间将设置为空值

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml"/>
    <xsl:template match="/NewDataSet">
        <Foo namespace="http://MyLink/FixedVersion">
            <Bar>
                <SomeData/>
            </Bar>
        </Foo>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<Foo namespace="http://MyLink/FixedVersion">
    <Bar>
        <SomeData />
    </Bar>
</Foo>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml"/>
    <xsl:template match="/NewDataSet">
        <xsl:element name="Foo" namespace="http://MyLink/{Table/version}">
            <Bar>
                <SomeData/>
            </Bar>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns="http://MyLink/v02_04_01">
    <Bar xmlns="">
        <SomeData />
    </Bar>
</Foo>
<?xml version="1.0"?>
<Foo xmlns="http://MyLink/v02_04_01">
    <Bar>
        <SomeData/>
    </Bar>
</Foo>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml"/>
    <xsl:template match="/NewDataSet">
        <Foo namespace="http://MyLink/FixedVersion">
            <Bar>
                <SomeData/>
            </Bar>
        </Foo>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<Foo namespace="http://MyLink/FixedVersion">
    <Bar>
        <SomeData />
    </Bar>
</Foo>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml"/>
    <xsl:template match="/NewDataSet">
        <xsl:element name="Foo" namespace="http://MyLink/{Table/version}">
            <Bar>
                <SomeData/>
            </Bar>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns="http://MyLink/v02_04_01">
    <Bar xmlns="">
        <SomeData />
    </Bar>
</Foo>
<?xml version="1.0"?>
<Foo xmlns="http://MyLink/v02_04_01">
    <Bar>
        <SomeData/>
    </Bar>
</Foo>

声明它们在不同的名称空间中,但我不明白固定和动态值如何改变这一点


我的预期结果是有第一个输出,但是有一个动态的
版本
值。

似乎必须在每个元素上显式地创建名称空间。第一个示例中的错误是根本没有创建命名空间:

<Foo namespace="http://MyLink/FixedVersion">
    <Bar>
        <SomeData />
    </Bar>
</Foo>
输出为:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml"/>
    <xsl:template match="/NewDataSet">
        <Foo namespace="http://MyLink/FixedVersion">
            <Bar>
                <SomeData/>
            </Bar>
        </Foo>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<Foo namespace="http://MyLink/FixedVersion">
    <Bar>
        <SomeData />
    </Bar>
</Foo>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml"/>
    <xsl:template match="/NewDataSet">
        <xsl:element name="Foo" namespace="http://MyLink/{Table/version}">
            <Bar>
                <SomeData/>
            </Bar>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns="http://MyLink/v02_04_01">
    <Bar xmlns="">
        <SomeData />
    </Bar>
</Foo>
<?xml version="1.0"?>
<Foo xmlns="http://MyLink/v02_04_01">
    <Bar>
        <SomeData/>
    </Bar>
</Foo>

元素的扩展名称(即(名称空间,本地名称)对)完全由创建元素的指令决定;它不以任何方式依赖于结果树中元素的父元素。您永远不能依赖元素与其父元素进入同一命名空间

对于文本结果元素,如
,结果树中元素的扩展名与样式表中元素的扩展名相同。也就是说,它由XML名称空间规范的规则决定:名称空间URI由样式表中的xmlns名称空间声明决定(可以出现在文本结果元素本身上,也可以出现在任何祖先元素上)。这意味着名称空间是一个静态常量,不能动态计算

对于使用xsl:element构造的元素,有两种指定名称空间的方法。如果存在
名称空间
属性,则其有效值(解释为AVT)将建立构造元素的名称空间URI。因为这是一个AVT,所以可以动态计算名称空间

在缺少
名称空间
属性的情况下,
名称
属性的值被解释为词汇QName,名称空间的确定方式与文本结果元素相同,使用样式表中
xsl:element
指令范围内的名称空间声明。使用此机制,您可以在一组固定的静态已知名称空间之间动态选择,但无法完全动态计算名称空间:

<xsl:stylesheet xmlns:a="http://one-uri/" xmlns:b="http://another-uri/">
....
   <xsl:element name="{if (x) then 'a' else 'b'}:foo">

....

+1-我正要回答类似的问题。请随意使用我的小提琴: