XSLT 希望删除属性然后重新匹配元素

XSLT looking to remove attribute then rematch the element

所以我正在使用 RenderX 处理 XSLT 样式表以生成 pdf 作为输出。

目前,我正在尝试找出一种方法,在元素具有特定属性时将一些简单样式应用于元素,然后也想匹配它们的常规模板。我试图利用 xsl:copy,但我还没有成功,我不确定是否有可能实现我想做的事情

<xsl:template match="node()[@ns:change='del' and not(@ns:changed='true')]" mode="#all" priority="1">
  <fo:inline text-decoration="line-through" color="#FF0000">
    <xsl:copy>
        <xsl:attribute name="ns:changed">true</xsl:attribute>
        <xsl:apply-templates select="." mode="#current"/>
    </xsl:copy>
  </fo:inline>
</xsl:template>

本质上,我希望模板第一次匹配是在它获得删除线且颜色为红色时,然后它能够​​匹配所有常规样式和格式。

我一直在尝试制定一个包罗万象的解决方案,因为我们有 100 个使用不同模式的模板,所以我能想到的另一个解决方案是检查属性的每个单独模板,但我希望尽可能避免这种情况。

目前我运行陷入递归问题(即属性未设置)或优先级=1的模板根本不匹配的问题。

使用xsl:next-match(参见https://www.w3.org/TR/xslt20/#element-next-match)恢复常规处理:

<xsl:template match="node()[@ns:change='del' and not(@ns:changed='true')]"
    mode="#all" priority="1">
  <fo:inline text-decoration="line-through" color="#FF0000">
    <xsl:next-match />
  </fo:inline>
</xsl:template>

如果围绕常规格式包装 fo:inline 不够,您可以在 xsl:next-match 上设置参数,然后使用常规模板中的参数值做正确的事情。