次のようなインデックスのエントリがあります。
<entry name="a" page="1" />
<entry name="b" page="3" />
<entry name="b" page="4" />
<entry name="b" page="6" />
<entry name="c" page="7" />
今、私は次のようなものを取得したいと思います
<index name="a" pages="1 />
<index name="b" pages="3-4, 6" />
<index name="c" pages="7" />
そのためにすぐに使える機能はありますか?
私は2パスの解決策を考えていました.最初にインデックスエントリを次のような形式にします.
<index name="a" pages="1 />
<index name="b" pages="3 4 6" />
<index name="c" pages="7" />
「3 4 6」を「3-4, 6」に変えます。最初のステップは簡単です:
<xsl:for-each-group select="index" group-adjacent="@name">
<xsl:element name="index">
<xsl:attribute name="name" select="@name"/>
<xsl:attribute name="pages" select="current-group()/@page"/>
</xsl:element>
</xsl:for-each-group>
(もちろん、ここでの「ページ」属性は別のものである可能性があります)
次は難しいステップです。リストをどのように反復処理すればよいでしょうか。次の sibling/@page (ページをシーケンスに入れることができます) が現在の @page + 1 であるかどうかを確認するための賢い解決策が必要です。