XSLT正则表达式只接受字符串中的少数字符

时间:2015-08-11 11:54:46

标签: regex xml xslt special-characters

我正在写一个正则表达式,只允许下面的特殊字符:

- _ * & . , #

我写了下面的函数,它将避免除以下模式中提到的所有字符:

<xsl:function name="wd:allowed_characters">
    <xsl:param name="input_param" />
    <xsl:if test="$input_param !=' '" >
        <xsl:value-of select="normalize-space(replace($input_param,'[^.#, \- _ * a-zA-Z0-9]',''))" />
    </xsl:if>
</xsl:function>

我的问题是每当我尝试在任何地方添加&模式时,我都会遇到以下错误:

  

严重程度:致命的   说明:实体名称必须紧跟“&amp;”在实体中

     

严重性:错误
  描述:无法编译样式表。检测到1个错误。

我想知道如何像其他特殊字符一样在模式中添加&

2 个答案:

答案 0 :(得分:2)

XSLT是用XML编写的,因此XSLT样式表的源代码必须是格式良好的(通常也是有效的)XML。在XML中,有五个特殊字符:<>&"',大致只能按如下方式使用:

  • 如果引号也是边界字符,则必须在内部属性值中转义引号,如test=" &quot;foo&quot; "中所示。通常,您可以通过使用其他引号将其包围来编写属性值:test=' "foo" 'test=" 'foo' "都是有效的。在XPath中,通常用XSLT在属性值中编写,这是编写字符串文字的常用方法(这是你在上面的代码中已经做过的事情)。
  • 在属性值或允许自由文本的任何其他位置,您必须始终分别在<&中转义&lt;&amp;
  • >永远不需要逃脱,但很多人都这样做。
  • 五个&#34;逃脱&#34;始终可用作命名实体引用,无论是否存在DTD:&lt;&gt;&amp;&quot;&apos;,其他命名实体引用首先需要在DTD中声明(通常用于&nbsp;)。
  • 仅在CDATA部分内(以及评论中)您不需要转义任何这些字符:<![CDATA[<hello>&]]>&lt;hello>&amp;完全相同。 CDATA部分仅允许在文本节点中使用,而不能在属性值中使用。

经常令人困惑。如果源文档在XML中包含&lt;,则您无法通过将其与字符串&lt;进行比较来找到它,因为它本质上只是< }字符。相反,您必须搜索<。但是,由于XSLT是用XML编写的,因此编写<xsl:if test="contains(.,&lt; )"将搜索<字符,而不是四字符字符串&lt;

关于你的问题,你可以简单地写下你的表达方式:

  • replace($input_param,'[^&amp;.#,_*a-zA-Z0-9-]','')
  • 我删除了空格(不确定是故意的)
  • 我将-放在最后,不需要转义
  • 您的xsl:if是多余的:normalize-space将创建一个仅包含与空字符串相同的空格的字符串。有或没有xsl:if会有相同的结果

注意:由于转义,引用问题和其他事情的复杂性,通常在变量的序列构造函数中编写正则表达式,以防止这些问题首先发生(添加了x-modifier允许正则表达式中的空格:

<xsl:variable name='regex' as='xs:string'>
    [^&amp;.#,_*a-zA-Z0-9-]
</xsl:variable>

<xsl:function name="wd:allowed_characters" as="xs:string">
    <xsl:param name="input_param" as="xs:string" />
    <xsl:value-of select="
       normalize-space(
       replace($input_param, $regex, '', 'x'))" />
</xsl:function>

答案 1 :(得分:1)

据我所知,在XML中,我们不能使用&#39;&amp;&#39;的直接键,它应该是&#39;&amp; [A-z0-9]的组合+;&#39 ;.在XML中,我们可以使用&#39;&amp; amp;&#39;或&#39;&amp;#x0026;&#39;实体格式。 在regex&#39; [^。#,&amp; amp;&amp;#x0026; - _ * a-zA-Z0-9]&#39;可以使用。