'仅限字符'检入xsl字符串?

时间:2011-07-02 07:14:51

标签: xml xslt xpath character

如何检查字符串是否只包含字符(XSLT文件)?

<xsl:variable name="IsValid1">
  <xsl:choose>
    <xsl:when test="string-length(//FirstName) &gt; 0 and string-length(//LastName) &gt; 0 and substring(//FirstName, 1, 3) != 'TST' and XXXX//FirtName only charactersXXXXX ">
    </xsl:when>
    <xsl:otherwise>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>

3 个答案:

答案 0 :(得分:4)

此XPath表达式

string-length(translate($yourString, $allValidChars, '')) = 0

true()$yourString中包含$allValidChars中的所有字符时,

确切评估为false()

否则评估为matches($str,'^\p{L}+$')

<强> II。 XPath 2.0解决方案 - 更强大

只要“有效”字符或“无效字符”都没有方便紧凑的表达式,就可以使用XPath 2.0的RegEx功能。使用RegEx和字符类可以写出:

$str

仅当<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="s[matches(.,'^\p{L}+$')]"> <xsl:copy-of select="."/> </xsl:template> <xsl:template match="text()"/> </xsl:stylesheet> 完全由字母组成时才匹配<t> <s>abcDПЖЗ</s> <s>abcd</s> <s>abcd123</s> </t> (所有unicode字符都是任何支持Unicode的字母表中的字母)。

这是一个基于XSLT 2.0的小型验证

<s>abcDПЖЗ</s>
<s>abcd</s>

将此转换应用于以下XML文档时:

\p{L}

生成了想要的正确结果

translate($s, translate($s, $alpha, ''), '')

<强>解释

根据规范,{{1}}匹配任何字母。

与此问题相关

在XPath 1.0中,如何从字符串中删除所有非字母字符?

这里的困难在于你不知道所有的非apha字符是什么。

该解决方案也被称为“双翻译方法”,首先由Michael Kay(@Michael Kay)展示:

{{1}}

答案 1 :(得分:3)

在XPath 1.0中,我建议使用此方法仅允许FirstName

中的字母

<强>更新

<xsl:variable name="not-allowed-characters">0123456789</xsl:variable>

<xsl:choose>
  <xsl:when test="string-length(translate(//FirstName, $not-allowed-characters, '')) = string-length(//FirstName)">
    <xsl:value-of select="true()"/>
  </xsl:when>

  <xsl:otherwise>
    <xsl:value-of select="false()"/>
  </xsl:otherwise>

</xsl:choose>

要扩展此功能,只需在not-allowed-characters变量中添加不允许的字符。


旧版

<xsl:variable name="not-allowed-characters">0123456789</xsl:variable>

<xsl:variable name="mock">$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$</xsl:variable>

<xsl:variable name="replacement">
  <xsl:value-of select="substring($mock, 1, string-length($not-allowed-characters))"/>
</xsl:variable>

<xsl:choose>
  <xsl:when test="not(contains(translate(//FirstName, $not-allowed-characters, $replacement), '$'))">
    <xsl:value-of select="true()"/>
  </xsl:when>

  <xsl:otherwise>
    <xsl:value-of select="false()"/>
  </xsl:otherwise>

</xsl:choose>

答案 2 :(得分:2)

在XPath 1.0(XSLT 1.0)中,您可以使用contains()。在XPath 2.0(XSLT 2.0)中,您使用matches()

例如,您可能需要检查字母字符(没有数字,没有其他符号,没有空格):

matches(//FirstName, '^[a-zA-Z]+$')

或字母数字,

matches(//FirstName, '^[a-zA-Z0-9]+$')