私は xslt 2.0 を使用しています。次のサンプル xml があります。2 つの「header-gray」ノードの間にあるすべての「header-lightgray」ノードを取得したいのですが、問題は次のとおりです。「header-lightgray」がいくつあるかわかりません。そこの。そのため、position() 関数を使用できません。およびそれぞれの xsl はブレークをサポートしていません。
<t>
<parent class="header-gray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
...
<parent class="header-gray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-gray"></parent>
</t>
それらを調べて、すべてのノード、header-gray を div に、header-lightgray を span に置き換えたいと思います。期待される出力は次のとおりです。
<div class="header-gray">
<span class="header-lightgray"/>
<span class="header-lightgray"/>
<span class="header-lightgray"/>
...
</div>
<div class="header-gray">
<span class="header-lightgray"/>
<span class="header-lightgray"/>
<span class="header-lightgray"/>
</div>
では、どうやってそれを行うのですか?
どんな助けでも大歓迎です。
Jan Vlcinskyの答えに従って共有したい解決策:
<xsl:for-each select="/t/parent[@class='header-gray']">
<xsl:variable name="ns1" select="current()/following-sibling::parent"/>
<xsl:variable name="ns2" select="current()/following-sibling::parent[@class='header-gray'][1]/preceding-sibling::parent"/>
<div class="header-gray">
<xsl:for-each select="$ns1[count(.| $ns2)=count($ns2)]">
<span class="header-lightgray"/>
</xsl:for-each>
</div>
</xsl:for-each>
上記のコードは検証していませんが、実際のコードでは同じロジックです。私が使用しているlxml 2.3がxslt 2をサポートしていないことがわかったので、xslt 2.0の方法は使用しませんでした。