我有一个(简化的)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的新手。任何建议将不胜感激。
谢谢!
答案 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必须匹配。