2017-07-11 4 views
0

私は指定されたパスで子を再帰的に選択する必要があります。 これは私のXML構造です:PARAM:XSLTの動的なxpathの子の選択

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

は私がXSLによって渡された(最初の要素の第2子を選択するために、「0-1」のように)パスすることによって、特定の項目を選択する必要があります。私はその子の位置に関する実際のノードのパスを表す文字列を持っています。

これが可能かどうか誰かが知っていますか?

私はサクソン9.8heを使用します。サクソン9.8で事前

+0

したがって、XSLTのバージョンを使える?動的XPath評価を提供するものもあります。その場合、他の構文ではなく、 '/ items/item [1]/item [2]'のような標準的なXPath構文を渡す必要があります。 –

+0

'' 0-1 ''はパスではありません。パラメータがどのように見えるかを正確に表示し、どのプロセッサを使用するかを明記してください。 –

+0

申し訳ありませんが、私はsaxon 9.8heを使用しています。 "パス"は対応する子番号のみで構成されますが、文字列paramとして渡すことができれば、 "/ items/item [1]/item [2]"のようなXPath文字列を使っても問題ありません。これは可能ですか? – HYMXDEV

答えて

0

まずtokenize()関数を用いてそのような(1,4,6)のような正の整数のシーケンスに順番$pathし、この再帰関数を呼び出す:これはXSLTプロセッサ

<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

おかげで、XSLT 3.0あなたは、パス式

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

、あなたが通常のselect属性を使用することはありませんそのパスを使用したいとstatic parameterを使用することができますが、代わりに対応するshadow attribute_select="{$path}"

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

このパラメータは、他のパラメータと同様にスタイルシートを実行するときに設定できます。