2017-07-11 51 views
0

我需要通過給定的路徑遞歸地選擇孩子。 這是我的XML結構:XSLT動態xpath子選擇

<items> 
    <item name="first"> 
     <item name="fist-first"> 
     [...] 
     </item> 
     <item name="first-second"> 
     [...] 
     </item> 
     [...] 
    </item> 
</items> 

我需要的路徑選擇特定的項目(如「0-1」來選擇第一要素的第二個孩子)通過XSL傳遞:PARAM。我有一個字符串表示與他們的孩子位置有關的實際節點路徑。

有誰知道這是否可能,並給我一些幫助?

我使用撒克遜9.8he。

在此先感謝

+0

所以其中XSLT處理器,其XSLT版本你能用嗎?一些提供動態XPath評估。在這種情況下,你需要傳遞標準的XPath語法,比如'/ items/item [1]/item [2]',而不是其他語法。 –

+0

'「0-1」'不是路徑。準確告訴我們你的參數是什麼樣的 - 並指出你將使用哪種處理器。 –

+0

對不起,我用撒克遜9.8he。 「路徑」只包含相應的子編號,但如果我可以將它作爲字符串參數傳遞,它可以使用像「/ items/item [1]/item [2]」這樣的XPath字符串。這可能嗎? – HYMXDEV

回答

0

首先轉$path成正整數,例如(1,4,6)的序列,使用tokenize()函數,然後調用該遞歸函數:

<xsl:function name="f:by-path" as="element()?"> 
<xsl:param name="origin" as="element()*"/> 
<xsl:param name="path" as="xs:integer*"/> 
<xsl:sequence select=" 
    if (empty($path)) 
    then $origin 
    else $origin[head($path)]/f:by-path(*, tail($path))"/> 
</xsl:function> 
+0

謝謝,那正是我需要的! – HYMXDEV

0

隨着撒克遜9.8和XSLT 3.0,你可以使用一個static parameter與路徑表達式

<xsl:param name="path" static="yes" as="xs:string" select="'/items/item[1]/item[2]'"/> 

,並要使用這條道路,你不會用正常select屬性,但而是例如相應的shadow attribute_select="{$path}"

<xsl:template match="/"> 
    <xsl:copy-of _select="{$path}"/> 
</xsl:template> 

然後,您可以像運行其他參數一樣運行樣式表時設置該參數。