在xslt样式表中,我使用exsl:node-set和set:distinct方法来访问和过滤包含结果树片段的变量中的惟一节点。我可以将这些节点的值写入我的输出文件中,例如:
<xsl:variable name="myNodes">
<xsl:call-template name="getNodes"/>
</xsl:variable>
<xsl:for-each select="set:distinct(exsl:node-set($myNodes)/key)">
<xsl:value-of select="."/>
</xsl:for-each>正如预期的那样,键的值被写入到输出中。但是,如果我尝试在XPath表达式中使用这些值,它将失败:
<xsl:for-each select="set:distinct(exsl:node-set($myNodes)/key)">
<xsl:variable name="result" select="/tree//somenode[@key = current()]"/>
<xsl:value-of select="$result"/>
</xsl:for-each>现在,输出是空的,而我知道在我的输入-xml中有一个应该由XPath表达式选择的"somenode“,并且它的值不为空。
现在我的问题是:为什么会发生这种情况?
我使用的是Java 1.6、Xerces 2.7和Xalan 2.7。
更新:根据请求,example: xml文档的一些数据包含:
<tree>
<somenode key="123"/>
<num>123</num>
<num>0815</num>
</tree>getNodes模板:
<xsl:template name="getNodes">
<xsl:for-each select="/tree/num">
<xsl:element name="key">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:template>发布于 2010-08-26 20:51:37
这里的是一个转换,它能做一些你想要做的事情,
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:set="http://exslt.org/sets"
xmlns:exsl="http://exslt.org/common"
>
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:variable name="myNodes">
<xsl:call-template name="getNodes"/>
</xsl:variable>
<xsl:variable name="vDoc" select="/"/>
<xsl:for-each select="set:distinct(exsl:node-set($myNodes)/key)">
<xsl:variable name="result" select="$vDoc/tree//somenode[@key = current()]"/>
<xsl:copy-of select="$result"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="getNodes">
<xsl:for-each select="/tree/num">
<xsl:element name="key">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>在所提供的XML文档上应用时的
<tree>
<somenode key="123"/>
<num>123</num>
<num>0815</num>
</tree>生成所需的结果
<somenode key="123"/>注意到
在
<xsl:for-each>**,中不能直接访问源XML文档**因为这条指令将当前节点设置为另一个文档中的节点--由exsl:node-set().$vDoc**.**中捕获源文档我们通过这个variable.<xsl:for-each>内的源文档没有文本节点后代,因此没有字符串值。在其上使用<xsl:value-of>不会产生任何输出。这就是我们在这里使用<xsl:copy-of>的原因--它会复制完整的元素,然后我们就会看到结果。发布于 2010-08-26 21:22:34
此样式表的功能与您想要的一样,不需要扩展:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="NumByValue" match="num" use="."/>
<xsl:template match="num[count(.|key('NumByValue',.)[1])=1]">
<xsl:copy-of select="../somenode[@key=current()]"/>
</xsl:template>
</xsl:stylesheet>输出:
<somenode key="123" />https://stackoverflow.com/questions/3574483
复制相似问题