gpt4 book ai didi

java - 为什么我不能使用通过 exsl :node-set/set:distinct in an XPath-Expression? 检索的节点值

转载 作者:行者123 更新时间:2023-11-29 06:19:56 24 4
gpt4 key购买 nike

在 xslt-stylesheet 中,我使用方法 exsl:node-setset: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>

现在,输出为空,而我知道我的 input-xml 中有一个“somenode”应该由 XPath 表达式选择,并且它的值不为空。

现在我的问题是:为什么会发生这种情况?

我正在使用 Java 1.6、Xerces 2.7 和 Xalan 2.7。

更新:根据要求,示例的一些数据: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>

最佳答案

这是一个接近您想要的东西的转换:

<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"/>

请注意:

  1. 无法在 <xsl:for-each> 中直接访问源 XML 文档, 因为这条指令将当前节点设置为另一个文档中的节点——由 exsl:node-set() 创建的临时树.

  2. 出于这个原因,我们将源 XML 文档捕获到变量 $vDoc 中. 我们访问 <xsl:for-each> 中的源 XML 文档通过这个变量。

  3. 元素<somenode key="123"/>没有文本节点后代,因此没有字符串值。使用 <xsl:value-of>它不会产生任何输出。这就是我们使用 <xsl:copy-of> 的原因这里 -- 它复制了完整的元素,我们看到了结果。

关于java - 为什么我不能使用通过 exsl :node-set/set:distinct in an XPath-Expression? 检索的节点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3574483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com