我们可以在 xslt 1.0 中的 id 属性上添加正则表达式或任何模式过滤器吗?

Can we add regex or any pattern filter on id attribute in xslt 1.0?

仅供参考:我在这里使用了 p 标签,但 id 属性可以出现在任何标签中。 我正在使用模式 [0-9a-fA-F]{24} 来允许这些类型的对象 ID。此模式表示 id 应仅包含 0-9 数字和 a-f 字母表中的 24 个字符。 如果任何标签包含与上述 pattern/regex 不匹配的 id 属性,那么我想用 empy space 替换该 id。我的 xml 中还有许多其他标签,因此标签不应被删除,应按原样显示。 我有一个 xml 如下所示

   <root>
    <p id = "623cbd63ed6cdf6ecba73c21"> some text </p>
    <p id = "623cbd63ed6cdf6ecba73c27"> some text </p>
    <p id = "244c601f7498439a81b4dac0545fc7ea"> some text </p>
    <p id = "abcasa"> some text </p>
    <ol> some text <li>list</li>
    </ol>
    <b> some text </b>
    </root>

期望的输出:

<root>
    <p id = "623cbd63ed6cdf6ecba73c21"> some text </p>
    <p id = "623cbd63ed6cdf6ecba73c27"> some text </p>
    <p id = ""> some text </p>
    <p id = ""> some text </p>
    <ol> some text <li>list</li>
    </ol>
    <b> some text </b>
</root>

提前致谢。

嗯,XPath 2.0 和 XSLT 2.0 以及更高版本都有一个 matches 函数,因此您的正则表达式需要“锚定”,即 ^[0-9a-fA-F]{24}$,否则您可以使用例如<xsl:template match="@id[not(matches(., '^[0-9a-fA-F]{24}$'))]"><xsl:attribute name="{name()}"/></xsl:template>.

XSLT 1.0 不支持正则表达式(除非您的特定处理器通过扩展函数支持它)。

在这种情况下,你可以不用:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="@id[translate(., '0123456789ABCDEFabcdef', '') or string-length(.) !=24]">
    <xsl:attribute name="id"/>
</xsl:template>

</xsl:stylesheet>