无法使用自定义命名空间

时间:2017-05-11 22:00:34

标签: xml xslt-1.0

以下是我的xml格式:

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns="http://www.example.com/xyz" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <child>
                <element1>xyz</element1>
                <element2>def</element2>
        </child>
</Root>

这是我的xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns="http://www.example.com/xyz"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/">
        <xsl:for-each select="Root/child">
            <xsl:value-of select="element1"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

这没有任何输出

当我从XML文件中取出url时,我得到的输出没有任何问题。但是,我希望这可以使命名空间正常工作。

我根据我在网上找到的其他问题尝试了一些调整: 1)将match="/"更改为"match=Root" - 这只是打印出没有标签的整个文件

2)将xmlns="http://www.example.com/xyz"更改为xmlns:Root="http://www.example.com/xyz" - 这仍然没有打印出任何内容。

我已经阅读了其他一些类似的问题,但格式不同,以至于它对我的情况不起作用。

1 个答案:

答案 0 :(得分:1)

您必须使用xslt中的命名空间前缀限定自定义命名空间中的每个元素,例如:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:aa="http://www.example.com/xyz"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/">
        <xsl:for-each select="aa:Root/aa:child">
            <xsl:value-of select="aa:element1"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

此处的命名空间前缀是&#39; aa&#39;。

您可以在此处创建名称空间和前缀之间的关联

xmlns:aa="http://www.example.com/xyz"

你必须使用相同的前缀&#39; aa&#39;引用元素&#39; Root&#39;,&#39; child&#39;,&#39; element1&#39;和&#39; element2&#39;

喜欢这里

<xsl:for-each select="aa:Root/aa:child">
    <xsl:value-of select="aa:element1"/>
</xsl:for-each>

您还可以选择不同的前缀,&#39; aa&#39;只是一个例子。

&#39;根&#39;也在命名空间内,因为源xml文档中的命名空间定义已经包含引入命名空间的元素:

<Root xmlns="http://www.example.com/xyz"> ... </Root>

在您的源文档xml中,您尚未分配名称空间前缀。如果你想在那里分配前缀,它看起来像

<?xml version="1.0" encoding="utf-8"?>
<bb:Root xmlns:bb="http://www.example.com/xyz" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <bb:child>
                <bb:element1>xyz</bb:element1>
                <bb:element2>def</bb:element2>
        </bb:child>
</bb:Root>

这里的前缀是&#39; bb&#39;。如您所见,前缀不需要与样式表中的前缀匹配。