我需要在名称字段上执行验证,以查看它是否有任何非法字符。 以下是马正在进行的方式
substring()
第一个replace()捕获任何/所有非法字符,第二个replace()删除捕获的字符。
面临的问题是,“姓名”不一定总是有一些非法字符。它也可以是有效的名称。在这种情况下,变量$ illegalFirst将为空。这引发了一个错误“不允许空序列作为replace()的第二个参数”。
我尝试验证如下
<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>
此条件检查似乎不起作用。它仍然会抛出相同的错误消息。
从早上起我的头发都拉了。非常感谢任何帮助。
谢谢, 萨姆。
答案 0 :(得分:3)
您尝试做的是 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. ]', '')"/>
答案 1 :(得分:0)
您的XSL片段中存在一些错误,首先,您需要在此处用引号括起文字字符串:
<xsl:variable name="validChars" select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. '"></xsl:variable>
..否则上面的选择器将被解释为选择具有该无意义名称的子元素的指令,如:<abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.>
,我认为它远不及你的实际意图。
第二个是,您需要意识到replace()
函数在第一个参数中找到与第二个参数完全匹配的子字符串,然后将匹配的子字符串替换为第三个参数。我再次强烈怀疑这不是你打算做的。我想在这里使用translate()
函数代替replace()
:
<wd:First_Name>
<xsl:variable name="illegalFirst" select="translate($getUserData.firstname, $validChars, '')" />
<xsl:value-of select="translate($getUserData.firstname, $illegalFirst, '')"/>
</wd:First_Name>
旁注:即使在没有发现非法字符的情况下,translate()
函数也适用于我(尽管我只在XSLT 1.0中测试过)。