0

我有一个(简化的)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>

将我的内容包装在“entry”标签中似乎会导致我的 XSLT 中的此语句出现问题。

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

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

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

我在输出中得到了我期望的内容 (Hello,Hello)。我已经验证了复制 $xmlfile 会返回完整的 XML 文件。我确信我在语法上做的不对,因为我是 XSL 的新手。任何意见,将不胜感激。

谢谢!

4

2 回答 2

0

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

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

于 2014-03-12T23:17:23.550 回答
0

问题确实出在入口元素上......

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

这里的xmlns属性实际上是一个命名空间声明。或者更确切地说,因为它确实声明了一个前缀(就像xmlns:api一样),所以它是默认命名空间。这意味着entry元素及其子标签元素属于命名空间。

现在,您的 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 必须匹配。

于 2014-03-12T23:20:00.687 回答