2016-08-05 133 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> 

這些模板不依賴於如何從上層結構應用dataSet模板。

爲了您的參考,我添加了與上述示例對應的等效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> 
相關問題