我们可以在 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>
仅供参考:我在这里使用了 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>