首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能在XPath表达式中使用通过exsl:node-set/set:distinct检索到的节点值?

为什么不能在XPath表达式中使用通过exsl:node-set/set:distinct检索到的节点值?
EN

Stack Overflow用户
提问于 2010-08-26 19:07:15
回答 2查看 878关注 0票数 1

在xslt样式表中,我使用exsl:node-setset:distinct方法来访问和过滤包含结果树片段的变量中的惟一节点。我可以将这些节点的值写入我的输出文件中,例如:

代码语言:javascript
复制
<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表达式中使用这些值,它将失败:

代码语言:javascript
复制
<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文档的一些数据包含:

代码语言:javascript
复制
<tree>
  <somenode key="123"/>
  <num>123</num>
  <num>0815</num>
</tree>

getNodes模板:

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-26 20:51:37

这里的是一个转换,它能做一些你想要做的事情,

代码语言:javascript
复制
<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文档上应用时的

代码语言:javascript
复制
<tree>
  <somenode key="123"/>
  <num>123</num>
  <num>0815</num>
</tree>

生成所需的结果

代码语言:javascript
复制
<somenode key="123"/>

注意到

  1. The <xsl:for-each>**,中不能直接访问源XML文档**因为这条指令将当前节点设置为另一个文档中的节点--由exsl:node-set().
  2. For创建的临时树,所以我们在一个变量XML $vDoc**.**中捕获源文档我们通过这个variable.
  3. The元素访问<xsl:for-each>内的源文档没有文本节点后代,因此没有字符串值。在其上使用<xsl:value-of>不会产生任何输出。这就是我们在这里使用<xsl:copy-of>的原因--它会复制完整的元素,然后我们就会看到结果。
票数 3
EN

Stack Overflow用户

发布于 2010-08-26 21:22:34

此样式表的功能与您想要的一样,不需要扩展:

代码语言:javascript
复制
<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>

输出:

代码语言:javascript
复制
<somenode key="123" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3574483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档