私はXSLTを使い始めています。私は以下のような構造の非常に複雑な文書を処理しています。それは、data
とmeta
の2つのセクションに分かれています。各data/item
については、対応するmeta/item
の「実際の」クラスを調べる必要があります。XPath:関数から返されたノードセットからの選択
<root>
<data>
<item id="i1">
<h3 id="p2">akkakk</h3>
<p id="p3">osijaoid</p>
<p id="p4">jqidqjwd</p>
<item>
</data>
<meta>
<item ref="i1">
<p ref="p2" class="heading"/>
<p ref="p3" class="heading"/>
<p ref="p4" class="body"/>
</item>
</meta>
</root>
私は自分のクラス属性にmeta
でグループ隣接p
要素にする必要があります。
<xsl:function name="fn:node-groups" as="node()*">
<xsl:param name="parent"/>
<xsl:variable name="nodeRefs" select="root($parent)//meta/item[@ref = $parent/@id]/p"/>
<xsl:for-each-group select="$nodeRefs" group-adjacent="@class">
<group class="{@class}">
<xsl:for-each select="current-group()">
<node ref="{@ref}"/>
</xsl:for-each>
</group>
</xsl:for-each-group>
</xsl:function>
そしてそのように、データノードを処理するときに、それを使用します。私は、ヘルパー関数は、このビットクリーナーを作ることができると思いました。私の問題は、関数によって返されたノードセットからさらに選択できないことです。
<xsl:template match="//data/item">
<!-- works -->
<xsl:variable name="test1" select="fn:node-groups(.)"/>
<!-- works -->
<xsl:variable name="test2" select="fn:node-groups(.)/*"/>
<!-- does not work -->
<xsl:variable name="test3" select="fn:node-groups(.)/group[@class = 'heading']"/>
</xsl:template>
私はtest2
のようにスターを書くことができ、それは私のすべてのnode
のノードを与えます。しかし、他のものは私に空のノードセットを与えるだけです。または少なくともそれはそのように見えますが、この時点で私は本当にもう知りません。
ありがとうを使用し、そのシーケンスをフィルタ処理したい場合は、あなたの関数によって返されたノード列が既に、
group
要素のシーケンスである<xsl:variable name="test3" select="mf:node-groups(.)/node"/>
にする必要があると思います!問題はもちろん、 'fn:node-groups(。)/ group [@class = 'heading']の代わりに' fn:node-groups(。)/ [@ class = 'heading'] ' ] '。ときには、あなたは立ち往生し、正しい方向に進むことができるように軽い動きが必要になることがあります。 – svenax