如果元素包含字母,如何写xslt?

mar*_*rko 6 regex xslt

Sth应该是所有字母或正则表达式[AZ].如何将xslt与正则表达式结合起来?

 <xsl:if test="string-contains(//ns0:elem/value, 'sth')">


        </xsl:if>
Run Code Online (Sandbox Code Playgroud)

Way*_*ett 10

XPath/XSLT 1.0不支持正则表达式,但可以使用基本字符串函数执行简单验证.

白名单

XPath 1.0 translate函数可用于模拟白名单:

<xsl:variable name="alpha" 
              select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:if test="string-length(translate(., $alpha, '')) &gt; 0">
    <!-- context node contains non-alpha characters -->
</xsl:if>
Run Code Online (Sandbox Code Playgroud)

该测试用于translate首先删除所有大写和小写字母.如果结果字符串的长度不为零,则原始字符串必须包含其他字符.

请注意,上面的表达式可以简化为:

<xsl:if test="translate(., $alpha, '')">
Run Code Online (Sandbox Code Playgroud)

...因为任何非空字符串的计算结果为true.

黑名单

使用双翻译方法将其$alpha视为黑名单:

<xsl:if test="translate(., translate(., $alpha, ''), '')">
    <!-- context-node contains characters on the blacklist (in $alpha) -->
</xsl:if>
Run Code Online (Sandbox Code Playgroud)

内部translate返回一个字符串,其中删除了所有字母字符,然后将其用作第二次translate调用的模板,从而生成仅包含字母字符的字符串.如果此字符串非零,则我们在黑名单中找到一个字符.这是一种经典的方法.例如,请参阅此前关于SO的问题:

黑名单测试也可以这样执行:

not(string-length(translate(., $alpha, ''))=string-length())
Run Code Online (Sandbox Code Playgroud)

如果删除所有列入黑名单的字符后字符串的长度不等于原始字符串的长度,则该字符串必须包含黑名单中的字符.

摘要

黑名单和白名单实际上是同一枚硬币的两面.以下演示了它们的用法:

<xsl:if test="translate(., $alpha, '')">
    [contains some characters not on the list]
</xsl:if> 
<xsl:if test="not(translate(., $alpha, ''))">
    [contains only characters on the list]
</xsl:if> 
<xsl:if test="translate(., translate(., $alpha, ''), '')">
    [contains some characters on the list]
</xsl:if>
<xsl:if test="not(translate(., translate(., $alpha, ''), ''))">
    [contains only characters not on the list]
</xsl:if>
Run Code Online (Sandbox Code Playgroud)