具有特定属性值的第一个子节点上的XSL FO匹配

时间:2016-08-05 10:36:13

标签: xml xslt xsl-fo

我有一个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>

以上模板匹配不起作用。获得所需节点的正确方法是什么?

1 个答案:

答案 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>