【问题标题】:XSL FO Match On First Child Node With Specific Attribute Value具有特定属性值的第一个子节点上的 XSL FO 匹配
【发布时间】:2016-08-05 10:36:13
【问题描述】:

我有一个 FO 样式表,我想在其中匹配具有特定属性值的特定节点的第一次出现。在下面的示例中,我想匹配 name 属性等于 'MYNAME' 的第一个 <dataSet> 节点。

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

XML:

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

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

【问题讨论】:

  • 请发布一个可重现的示例 - 请参阅:minimal reproducible example
  • 选择dataSetxsl:apply-templates与处理dataSet的模板一样重要。 match="dataSet[@name='MYNAME'][1]" 将匹配当前上下文中的第一个 dataSetxsl:apply-templates 是否同时选择了所有 dataSet

标签: xml xslt xsl-fo


【解决方案1】:

如果您想匹配父元素中的第一个 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 2018-01-09
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2017-12-07
    相关资源
    最近更新 更多