2016-08-05 9 views
0

特定の属性値を持つ特定のノードの最初のオカレンスを照合するFOスタイルシートがあります。以下の例では、name属性が 'MYNAME'に等しい最初の<dataSet>ノードで照合したいと思います。特定の属性値を持つファースト・チャイルド・ノードのXSL FO一致

<xsl:template match="dataSet[@name='MYNAME'][1]"> 
... 
</xsl:template> 

XML:

<dataSet name='ALERTS'> 
... 
</dataSet> 
<dataSet name='MYNAME'> 
... 
</dataSet> 
<dataSet name='MYNAME'> 
... 
</dataset> 

上記テンプレートマッチングは動作しません。目的のノードを取得する適切な方法は何ですか?

+0

再現性の例を投稿してください - 参照:[MCVE]。 –

+0

'dataSet'を選択する' xsl:apply-templates'は、 'dataSet'を処理するテンプレートと同じくらい重要です。 'match =" dataSet [@ name = 'MYNAME'] [1] "'は現在のコンテキストの最初の 'dataSet'にマッチします。 'xsl:apply-templates'は' dataSet'をすべて同時に選択していますか? –

答えて

0

最初のdataSet [@ name = 'MYNAME']が親要素内で一致するようにするには、XSLT 2.0を使用できます。テンプレートは次のように動作します。

<xsl:template match="dataSet[. is (parent::*/dataSet[string(@name) eq 'MYNAME'])[1]]"> 
    ... 
</xsl:template> 

また、最初のdataSet [@ name = 'MYNAME']をドキュメント内で一致させる場合は、フォローテンプレートが機能します。

<xsl:variable name="firstDataSet" as="element()?" select="(//dataSet[string(@name) eq 'MYNAME'])[1]"/> 

<xsl:template match="dataSet[. is $firstDataSet]"> 
    .... 
</xsl:template> 

これらのテンプレートは、データセットテンプレートが上部構造からどのように適用されるかには依存しません。

参考までに、上記の例に相当する同等のXSLT 1.0スタイルシートを追加しました。

<xsl:template match="dataSet[@name='MYNAME'][generate-id(.) = generate-id((parent::*/dataSet[string(@name) = 'MYNAME'])[1])]"> 
    ... 
</xsl:template> 

それとも

<xsl:template match="dataSet[@name='MYNAME'][generate-id(.) = generate-id((//dataSet[string(@name) = 'MYNAME'])[1])]"> 
    ... 
</xsl:template> 
関連する問題