2010-03-21 60 views
6

我有一個文件,看起來像我可以在XSLT中動態構建此XPath查詢嗎?

<root> 
    <element> 
     <subelement1 /> 
     <subelement2 /> 
    </element> 
    <element> 
     <subelement2 /> 
     <subelement1 /> 
    </element> 
</root> 

在我的XSLT表中的/element[2]/[someNode]的方面,我希望得到一個數字,它代表/element[1]/[someNode]的距離(即,/element1/[someNode]前面的兄弟姐妹的數量)。例如,在/element[2]/subelement1的背景下,我想獲得數字2,從/element[1]/element[1]/subelement2的距離。我只需要從<element>的第一個實例中獲得給定節點名稱的距離。

憑直覺,我想我能夠構建這就像

<xsl:variable name="nodename" select="name()" /> 
<xsl:value-of select="/element[1]/$nodename/preceding-sibling::*" /> 

但不幸的是這片不會編譯。我試圖在XSLT中實現可能性嗎?

+0

你的例子似乎不一致:在'/ element [2]/[someNode]'的上下文中,想要查找'/ element [2]/[subelement1'中的例子'/ element [1]/[someNode]',從'/ element [1]'到'/ element [1]/subelement的距離2' - so [someNode]在這裏是subelement2還是subelement1? –

+0

參見http://stackoverflow.com/questions/4630023/dynamic-xpath-in-xslt – Vadzim

回答

8
  1. 不能使用XSLT變量作爲XPATH軸語句,但可以在謂詞過濾器中使用它。因此,如果要匹配任何元素(即*),然後將其限制爲名稱()等於存儲在變量中的值(即*[name()=$nodename])的元素,則XPATH將有效。

  2. 您正在構建的XPATH將返回匹配元素的值。如果要返回有多少元素符合該模式,則可以使用count()函數。

  3. 您的示例XML有一個文檔元素<root>,但您的XPATH不包括<root>

這將返回使用上下文節點指派的變量前同輩元素的個數:

<xsl:variable name="nodename" select="name()" /> 
<xsl:value-of select="count(/root/element[1]/*[name()=$nodename]/preceding-sibling::*)" /> 

您可以消除的變量,只需使用:

<xsl:value-of select="count(/root/element[1]/*[name()=name(current())]/preceding-sibling::*)" /> 
1

*[name() = $nodename]可能是你想要的,而不是$nodename,但你應該更好地用local-name()和namespace-uri()的值定義兩個變量並檢查例如*[local-name() = $localname and namespace-uri() = $namespaceuri]具有選擇元素的命名空間安全方式。

0

構建xpath's不幸是不可能的。 XPath是靜態編譯的;你不能隨時產生它們(或者如果你這樣做,它們只是字符串,不能被執行)。

不過,你可以是寫一個發生在交叉引用幾個值,它本身的動態查詢...