2016-05-23 15 views
0

を処理する方法は、preceding-siblingの軸の特定のノードの位置によって異なりますか?XSLT:先行する兄弟の位置に応じた処理要素

XMLコード:

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
     <text/> 
     <text/> 
     <text/> 
     <list_num_start/> 
     <list_num/> 
     <list_num/> 
     <list_x/> 
     <text/> 
     <text/> 
     <text/> 
     <list_square_start/> 
     <list_square/> 
     <list_square/> 
     <list_x/> 
    </root> 

テンプレート:残念ながら

<xsl:template match="list_x"> 
    <xsl:element name="li"> 
     <xsl:attribute name="class"><xsl:value-of select="name()"/></xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:element> 
    <xsl:choose> 
     <xsl:when test="position(preceding-sibling::list_num_start[last()]) &lt; position(preceding-sibling::list_square_start[last()])"> 
      <xsl:text disable-output-escaping="yes">&lt;/ol&gt;</xsl:text> 
     </xsl:when> 
     <xsl:otherwise>...</xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

position()は、任意の引数を許可していません。

出力は次のようになります。

<root> 
    <text/> 
    <text/> 
    <text/> 
    <ol> 
     <li class="list_num_start"/> 
     <li class="list_num"/> 
     <li class="list_num"/> 
     <li class="list_x"/> 
    </ol> 
    <text/> 
    <text/> 
    <text/> 
    <ul> 
     <li class="list_square_start"/> 
     <li class="list_square"/> 
     <li class="list_square"/> 
     <li class="list_x"/> 
    </ul> 
</root> 

ありがとう!

+0

希望する出力は何ですか? – zx485

+0

表示される出力は整形式のXMLではなく、XSL変換によって生成することはできません。 - あなたがここに適用したい論理を平易な言語で説明してください。動作していないコードは、説明の代わりに使用されるものではありません。 –

+0

コードが例として考えられました。問題は、 '先行兄弟'軸上の特定の先行要素を嫌う要素を処理する方法です。 – Ferestes

答えて

1

あなたは試みることがあります。

<xsl:when test="count(preceding-sibling::list_num_start[1]/preceding-sibling::*) &lt; 
      count(preceding-sibling::list_square_start[1]/preceding-sibling::*)"> 

これは、あなたが探している1前の要素をカウントします。

list_num_start[last()]list_num_start[1]に変更しました。私はあなたがlist_num_start要素を現在のものの直前に探していると仮定しているためです。

+0

これは問題なく動作します。ありがとうございました! – Ferestes

関連する問題