[英]Why can't I use values of nodes I retrieve by using exsl:node-set/set:distinct in an XPath-Expression?
在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>
現在,輸出為空,而我知道在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"/>
注意事項 :
不能在<xsl:for-each>
內部直接訪問源XML文檔,因為此指令將當前節點設置為另一個文檔中的節點-由exsl:node-set()
創建的臨時樹。
因此,我們將源XML文檔捕獲到變量$vDoc
。 我們通過此變量訪問<xsl:for-each>
內部的源XML文檔。
元素<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.