2011-07-26 40 views
2

不知道這是否可行,但嘗試設置一些不需要在從動態創建的節點塊中提取值時必須鍵入exslt:node-set的東西。我將整個節點集合存儲在一個變量中,並將其包裝在exslt:node-set中,但爲什麼當我試圖從它中取出時它不起作用。這可能嗎?自動化exslt:節點集?

<xsl:variable name="LANG"> 
    <xsl:variable name="tmp"> 
     <xsl:element name="foo"> 
      <xsl:element name="bar">Hello</xsl:element> 
     </xsl:element> 
    </xsl:variable> 
    <xsl:value-of select="exslt:node-set($tmp)"/> 
</xsl:variable> 


<!-- Love to be able to do this --> 
<xsl:value-of select="$LANG/foo/bar"/> 

<!-- This does work --> 
<xsl:value-of select="exslt:node-set($LANG)/foo/bar"/> 

回答

2

在XSLT 1.0,其定義爲在您的示例變量被稱爲結果樹片段(RTF)和只能使用xsl:copy-of整個片段複製到結果樹或xsl:value-of複製整個內容爲。例如

<xsl:copy-of select="$LANG"/> 

如果你想治療變量作爲一個臨時的樹,你需要的node-set()擴展。

在XSLT 1.0中處理靜態樹碎片(如查找表)的常用方法是將它們定義爲樣式表根元素的子元素(使用自定義命名空間)。然後你可以使用document()函數來檢索想要的值。

注意如果您正在使用撒克遜(V> 6.5),你可以簡單地設置樣式版本1.1,你將能夠管理的RTF沒有任何節點集擴展。


[XSLT 1.0]

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:empo="http://stackoverflow.com/users/253811/empo"> 

    <empo:LANG> 
     <empo:foo> 
      <empo:bar>Hello</empo:bar> 
     </empo:foo> 
    </empo:LANG> 

    <xsl:template match="/"> 
     <xsl:variable name="LANG" select="document('')/*/empo:LANG"/> 
     <xsl:value-of select="$LANG/empo:foo/empo:bar"/> 
    </xsl:template> 

</xsl:stylesheet>