我有一个FO样式表,我希望在特定节点的第一次出现时匹配特定的属性值。在下面的示例中,我想匹配名称属性等于'MYNAME'的第一个<dataSet>
节点。
<xsl:template match="dataSet[@name='MYNAME'][1]">
...
</xsl:template>
XML:
<dataSet name='ALERTS'>
...
</dataSet>
<dataSet name='MYNAME'>
...
</dataSet>
<dataSet name='MYNAME'>
...
</dataset>
以上模板匹配不起作用。获得所需节点的正确方法是什么?
答案 0 :(得分: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>