Sth应该是所有字母或正则表达式[A-Z].如何将xslt与正则表达式结合起来?
<xsl:if test="string-contains(//ns0:elem/value,'sth')"> </xsl:if>
XPath / XSLT 1.0不支持正则表达式,但可以使用基本字符串函数执行简单验证.
白名单
XPath 1.0转换功能可用于模拟白名单:
<xsl:variable name="alpha" select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> <xsl:if test="string-length(translate(.,$alpha,'')) > 0"> <!-- context node contains non-alpha characters --> </xsl:if>
测试使用translate来首先删除所有大写和小写字母.如果结果字符串的长度不为零,则原始字符串必须包含其他字符.
请注意,上面的表达式可以简化为:
<xsl:if test="translate(.,'')">
…因为任何非空字符串的计算结果为true.
黑名单
使用双翻译方法将$alpha视为黑名单:
<xsl:if test="translate(.,translate(.,''),'')"> <!-- context-node contains characters on the blacklist (in $alpha) --> </xsl:if>
内部翻译返回一个字符串,其中删除了所有字母字符,然后将其用作第二个翻译调用的模板,从而生成仅包含字母字符的字符串.如果此字符串非零,则我们在黑名单中找到一个字符.这是一种经典的方法.例如,请参阅此前关于SO的问题:
> Replace special characters in XSLT
黑名单测试也可以这样执行:
not(string-length(translate(.,''))=string-length())
如果删除所有列入黑名单的字符后字符串的长度不等于原始字符串的长度,则该字符串必须包含黑名单中的字符.
黑名单和白名单实际上是同一枚硬币的两面.以下演示了它们的用法:
<xsl:if test="translate(.,'')"> [contains some characters not on the list] </xsl:if> <xsl:if test="not(translate(.,''))"> [contains only characters on the list] </xsl:if> <xsl:if test="translate(.,'')"> [contains some characters on the list] </xsl:if> <xsl:if test="not(translate(.,''))"> [contains only characters not on the list] </xsl:if>