以下是我的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"
- 这仍然没有打印出任何内容。
我已经阅读了其他一些类似的问题,但格式不同,以至于它对我的情况不起作用。
答案 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;。如您所见,前缀不需要与样式表中的前缀匹配。