条目XML标记导致XSL值无效

时间:2014-03-12 20:44:45

标签: xml xslt value-of

我有一个(简化的)XML文件,我试图转换:

<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns="http://www.symplectic.co.uk/vivo/" xmlns:api="http://www.symplectic.co.uk/publications/api">
<tag>Hello, Hello.</tag>
</entry>

将我的内容包含在&#34;条目&#34; tag似乎在我的XSLT中导致了这个语句的问题。

<xsl:value-of select="$xmlfile/entry/tag"/>

其中$ xmlFile是上述XML的fn:document输出。我发现从XML中删除条目标记并简单地将我的XSLT修改为:

<xsl:value-of select="$xmlfile/tag"/>

我得到的内容(你好,你好)我期待我的输出。我已经验证了执行$ xmlfile的副本会返回完整的XML文件。我确信我在语法上做得不对,因为我是XSL的新手。任何建议将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:0)

XPath和XSLT是名称空间感知的。要在路径中指定命名空间节点,应为节点名称指定绑定到正确名称空间的前缀。

使用通配符,然后添加谓词以仅测试本地名称是可能的,但通常是错误的答案。命名空间是名称的一个有意义的部分。正确使用它们。

答案 1 :(得分:0)

问题确实在于条目元素......

<entry xmlns="http://www.symplectic.co.uk/vivo/"

此处的 xmlns 属性实际上是名称空间声明。或者更确切地说,因为它确实声明了一个前缀(如 xmlns:api ),它就是默认的命名空间。这意味着条目元素及其子标记元素属于命名空间。

现在,你的xslt正在这样做......

<xsl:value-of select="$xmlfile/entry/tag"/>

这是在寻找属于NO命名空间的条目标记元素。这些与属于命名空间的同名元素不同。

解决方案是在XSLT中使用前缀声明名称空间,如此

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:vivo="http://www.symplectic.co.uk/vivo/">

然后将xslt表达式更改为

<xsl:value-of select="$xmlfile/vivo:entry/vivo:tag"/>

请注意,实际前缀并不重要,但命名空间url必须匹配。