2014-03-12 22 views
0

我有我想要变换(简化)的XML文件:输入XML标签引起XSL价值的到不行

<?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> 

结束语我在“进入”内容标签似乎导致这个语句在我的XSLT中存在问题。

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

其中$ xmlFile是上述XML的fn:document输出。我发现,从XML删除该条目标签时,只需修改我的XSLT:

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

我得到的内容(你好,你好)我期待在我的输出。我已经证实,执行$ xmlfile的副本将返回完整的XML文件。我敢肯定,因为我是XSL的新手,所以我没有在语法上做正确的事情。任何意见,将不胜感激。

谢谢!

+1

如果删除“条目”上的“xmlns”属性,它是否工作? – David

+0

嗨,你应该能够在你的xpath查找中使用root的'entry'元素(参见这里的例子 - http://www.w3.org/TR/xslt20/#d5e25672)。两个问题。 1)如何定义'$ xmlfile'变量? 2)为什么你不在你的xpath中使用命名空间? (您能否提供完整的xsl) –

回答

0

的问题确实与进入元素...

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

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

现在,你的XSLT是做这个...

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

这是寻找进入标签属于没有命名空间元素。这些与具有属于命名空间的相同名称的元素不同。

的解决方案是声明命名空间,有一个前缀,在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必须匹配。

+0

非常感谢您的支持!这很好,现在我对XSLT有了更多的了解。 :) – daniel9x

0

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

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