【问题标题】:Remove illegal characters using xslt 2.0使用 xslt 2.0 删除非法字符
【发布时间】:2015-06-11 08:08:54
【问题描述】:

我需要对名称字段执行验证,看看它是否有任何非法字符。 以下是我目前的做法

<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> 

此条件检查似乎不起作用。它仍然会抛出相同的错误消息。

从早上开始就拔头发。非常感谢任何帮助。

谢谢, 山姆。

【问题讨论】:

    标签: regex xslt


    【解决方案1】:

    您正在尝试做的是一个 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. ]', '')"/>
    

    【讨论】:

      【解决方案2】:

      你的 XSL sn-p 有一些错误,首先,你需要在这里用引号括起来文字字符串:

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

      ..否则上面的选择器将被解释为选择具有该无意义名称的子元素的指令,例如:&lt;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.&gt;,我相信这与您的实际意图相去甚远。

      第二个是,您需要意识到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 中测试过)。

      【讨论】:

        猜你喜欢
        • 2022-11-21
        • 1970-01-01
        • 2017-12-06
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多