Regex 使用XSLT2.0删除非法字符

Regex 使用XSLT2.0删除非法字符,regex,xslt,Regex,Xslt,我需要对name字段执行验证,以查看它是否包含任何非法字符。 下面是马云目前的做法 <xsl:variable name="validChars" select="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. "></xsl:variable> <wd:First_Name> <xsl:variable name="illegalFirst" select="replace($getU

我需要对name字段执行验证,以查看它是否包含任何非法字符。 下面是马云目前的做法

<xsl:variable name="validChars" select="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. "></xsl:variable>
<wd:First_Name>
    <xsl:variable name="illegalFirst" select="replace($getUserData.firstname, $validChars, '')" />
    <xsl:value-of select="replace($getUserData.firstname, $illegalFirst, '')"/>
 </wd:First_Name>

第一个replace()捕获任何/所有非法字符,第二个replace()删除这些捕获的字符

我面临的问题是,“名字”不一定总是有一些非法字符。它也可以是有效的名称。在这种情况下,变量$illegalFirst将为空。这会引发错误“不允许将空序列作为replace()的第二个参数”

我尝试验证如下

<xsl:if test="string-length($illegalFirst) &gt; 0">
    <xsl:value-of select="replace($getUserData.firstname, $illegalFirst, '')"/>
</xsl:if>   
<xsl:if test="string-length($illegalFirst) = 0">
    <xsl:value-of select="$getUserData.firstname"/>
</xsl:if> 

这种状况检查似乎不起作用。它仍然抛出相同的错误消息

我从早上开始就在拔头发。非常感谢您的帮助

谢谢,
Sam.

您的XSL代码段中有一些错误,首先,您需要在此处用引号括起文字字符串:

<xsl:variable name="validChars" select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. '"></xsl:variable>

旁注:
translate()
函数适用于我,即使在没有发现非法字符的情况下(尽管我仅在XSLT 1.0中进行了测试)。

您试图做的是一个XSLT 1.0习惯用法,它使用
translate()
函数:

<xsl:variable name="validChars" select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. '"/>

<xsl:value-of select="translate($input-string, translate($input-string, $validChars, ''), '')"/> 

请注意定义$validChars变量时使用的单引号

在XSLT 2.0中,您可以省去双重筛选,只需使用:

<xsl:value-of select="replace($input-string, '[^a-zA-Z. ]', '')"/>

<xsl:value-of select="replace($input-string, '[^a-zA-Z. ]', '')"/>