我正在写一个正则表达式,只允许下面的特殊字符:
- _ * & . , #
我写了下面的函数,它将避免除以下模式中提到的所有字符:
<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个错误。
我想知道如何像其他特殊字符一样在模式中添加&
?
答案 0 :(得分:2)
XSLT是用XML编写的,因此XSLT样式表的源代码必须是格式良好的(通常也是有效的)XML。在XML中,有五个特殊字符:<
,>
,&
,"
,'
,大致只能按如下方式使用:
test=" "foo" "
中所示。通常,您可以通过使用其他引号将其包围来编写属性值:test=' "foo" '
或test=" 'foo' "
都是有效的。在XPath中,通常用XSLT在属性值中编写,这是编写字符串文字的常用方法(这是你在上面的代码中已经做过的事情)。<
和&
中转义<
和&
。>
永远不需要逃脱,但很多人都这样做。<
,>
,&
,"
和'
,其他命名实体引用首先需要在DTD中声明(通常用于
)。CDATA
部分内(以及评论中)您不需要转义任何这些字符:<![CDATA[<hello>&]]>
与<hello>&
完全相同。 CDATA部分仅允许在文本节点中使用,而不能在属性值中使用。经常令人困惑。如果源文档在XML中包含<
,则您无法通过将其与字符串<
进行比较来找到它,因为它本质上只是<
}字符。相反,您必须搜索<
。但是,由于XSLT是用XML编写的,因此编写<xsl:if test="contains(.,
&lt; )"
将搜索<
字符,而不是四字符字符串<
。
关于你的问题,你可以简单地写下你的表达方式:
replace($input_param,'[^&.#,_*a-zA-Z0-9-]','')
-
放在最后,不需要转义xsl:if
是多余的:normalize-space
将创建一个仅包含与空字符串相同的空格的字符串。有或没有xsl:if
会有相同的结果注意:由于转义,引用问题和其他事情的复杂性,通常在变量的序列构造函数中编写正则表达式,以防止这些问题首先发生(添加了x-modifier允许正则表达式中的空格:
<xsl:variable name='regex' as='xs:string'>
[^&.#,_*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;可以使用。