2011-10-05 57 views
5

這是一個初學者的問題。這個XPath表達式/..是什麼意思?它總是選擇一個空的節點集?在XSLT XPath中使用'/ ..'符號

我注意到,這種模式在FXSL庫中廣泛使用,例如:

<xsl:template name="map"> 
    <xsl:param name="pFun" select="/.."/> 
    <xsl:param name="pList1" select="/.."/> 

    <xsl:for-each select="$pList1"> 
    <xsl:copy> 
     <xsl:apply-templates select="$pFun"> 
     <xsl:with-param name="arg1" select="."/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:for-each> 
</xsl:template> 

是否有必要在這裏指定的參數值/..

回答

5

目的:

<xsl:param name="pFun" select="/.."/> 

是指定(至少在XPath 1.0中,其類型系統是非常弱),該參數$pFun的類型是一個節點(或更一般地,節點 - 組)。因此,讀者知道爲該參數傳遞的值不應該是字符串或整數。

它還指定默認值(如果在調用或應用模板時沒有明確指定此參數)是空節點集。

此表示法主要具有文檔意義(但請參閱此答案末尾的更新),僅適用於類型系統較弱的XPath 1.0。在XPath 2.0中,建議明確指定類型,以便XPath處理器可以執行更好的類型檢查,並且生成的代碼可以更優化和高效。

所以,在XPath中2.0/XSLT 2.0(在該特定情況下)會更好重構以上到:

<xsl:param name="pFun" as="element()"> 

有這樣的符號其它變型。在@邁克爾凱的早期著作之一也可以找到類似的表達式:

@comment() 

更新:表達/..比僅僅服務於文檔的目的更實際的用途。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <xsl:param name="pNode"/> 
    <xsl:copy-of select=".|$pNode"/> 
</xsl:template> 
</xsl:stylesheet> 

嘗試將此轉換應用於任何XML文檔。在我們的情況下,最簡單的可能

<t/> 

結果以下撒克遜錯誤消息(類似的錯誤與其他XSLT 1.0處理器):

Error at xsl:copy-of on line 8 of file:/(Untitled): 
    The value is not a node-set 
Transformation failed: Run-time errors were reported 

立即更換

<xsl:param name="pNode"/> 

<xsl:param name="pNode" select="/.."/> 

並再次運行轉換。

這次轉換沒有運行時錯誤。

結論:指定空節點集的能力在實踐中很重要,表達式/..是實現這一點的一種方式。

0

/是根節點(在XPath表達式開始時),因此/..將是根節點的父節點。

這沒有意義。

除非它應該是./..:即。當前(上下文)節點的父節點。

2

表達式/..選擇根節點的父節點,它保證沒有選擇任何東西。

/引用XML文檔的根節點,它實際上是文檔頂級的抽象概念,並在XPath中用作引用頂級項目的起點。它的子項將始終包含文檔元素,並且還可能包括頂級comment()processing-instruction(),它們是文檔元素的同級元素。

是否有必要在這裏指定/ ..參數的值?

不,不需要爲xsl:param提供默認選擇語句。在這種情況下,它被用來明確定義這些參數的默認值爲「無」。