2012-01-25 65 views
3

我有一個關於在XPATH中調用「父」軸的XSLT的性能的問題。 我可以通過調用父軸「:: *」或者我把它用「::」和元素的名稱XSLT 1.0:如何去「父」軸

parent::*/MVKE/item/VMSTA='Z2' 

parent::item/MVKE/item/VMSTA='Z2' 

是否重要,如果聰明的表現我使用「*」還是使用節點元素的名稱?這兩個工作,但我想知道有什麼不同。 可以請某人向我解釋?

非常感謝您的幫助和問候, 彼得

回答

3

第一表達式匹配任何元件父。第二個表達式僅在父元素爲item元素時匹配。這是唯一的區別。我無法想象會有任何顯着的性能影響,因爲兩個節點測試都可以在同一時間執行。

注意這條線從XPath 1.0 spec

每除根節點其他節點只有一個父,這是 任一元素節點或根節點。

在實踐中,這意味着parent::*匹配任何父除了根元素。

爲了演示,考慮這個簡單的例子文件:

<root> 
    <one/> 
    <item> 
     <two/> 
    </item> 
</root> 

然後:

  • //parent::*將讓你的rootitem元素(每父節點是一個元素)

  • //parent::item將僅返回item元素(th e只有母元素是item

  • //parent::node()會讓你成爲root的父母(即,根節點),以及在rootitem元素

1

這是不一樣的,但我懷疑會有一個顯著的性能差異。

使用*接受任何父元素,使用名稱將要求父母具有此名稱,否則您將獲得一個空的節點集。因此,如果速度更快,它可能是*之一。

另一種選擇是使用parent::node(),或它的短形式..

1

什麼簡單:

<xsl:value-of select="../node()"/> 

給你的直接父。那麼,是否有原始問題在另一種方法中的性能優勢?

+0

你問還是回答? –