簡體   English   中英

為什么不能在XPath-Expression中使用通過exsl:node-set / set:distinct檢索的節點的值?

[英]Why can't I use values of nodes I retrieve by using exsl:node-set/set:distinct in an XPath-Expression?

在xslt樣式表中,我使用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中應該由XPath表達式選擇一個“ somenode”,並且其值也不為空。

現在我的問題是:為什么會這樣?

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

更新:根據要求,示例的一些數據:xml doc包含:

<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> -它復制了完整的元素,我們看到了結果。

此樣式表無需擴展即可實現您想要的效果:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM