2016-11-28 13 views
1

私はXSLTを使い始めています。私は以下のような構造の非常に複雑な文書を処理しています。それは、datametaの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のノードを与えます。しかし、他のものは私に空のノードセットを与えるだけです。または少なくともそれはそのように見えますが、この時点で私は本当にもう知りません。

答えて

1

私はあなたのスタイルシートは、それが無い名前空間にgroup要素を選択し、それらを選択しないだろう、その名前空間内の関数で結果の要素を入れた後、明らかにfn:node-groups(.)/group機能についてxmlns="http://example.com/foo"名前空間宣言のスコープを持っているとします。だから関数が<xsl:for-each-group select="$nodeRefs" group-adjacent="@class" xmlns="">でその名前空間をオーバーライドしていることを確認してください。

あなたのスタイルシートがxpath-default-namespaceを定義している可能性があります。

私はまた、あなたの3番目の変数は、として明らかにあなたが<xsl:variable name="test3" select="fn:node-groups(.)[@class = 'heading']"/>

+0

ありがとうを使用し、そのシーケンスをフィルタ処理したい場合は、あなたの関数によって返されたノード列が既に、group要素のシーケンスである<xsl:variable name="test3" select="mf:node-groups(.)/node"/>にする必要があると思います!問題はもちろん、 'fn:node-groups(。)/ group [@class = 'heading']の代わりに' fn:node-groups(。)/ [@ class = 'heading'] ' ] '。ときには、あなたは立ち往生し、正しい方向に進むことができるように軽い動きが必要になることがあります。 – svenax

関連する問題