我想替换CDATA元素中的一些HTML标记,但是我很难在XSLT中获得正确的语法。我收到此错误消息:
net.sf.saxon.trans.XPathException: Error at character 9 in regular
expression "<img(\s+(?![^<>]*alt=["\'])[^<...": expected ()) (line 51)
我猜它不喜欢regEx中的<>
。
有谁知道如何在XSLT中写这个?
这是regEx:
<xsl:variable name="imgTagWithoutAltAttributePattern">
<xsl:text disable-output-escaping="yes"><img(\s+(?![^<>]*alt=["\'])[^<>]+)/></xsl:text></xsl:variable>
答案 0 :(得分:2)
我认为转义的<>
括号不是问题的根源。
查看错误消息,错误发生在char 9,其中需要结束括号")"
:
<img(\s+(?![^<>]*alt=["\'])[^<...
--------^
如你所见,"<>"
出来就好了。我怀疑正则表达式引擎不能以其他方式理解正则表达式(也许负面预测是问题?)。
我建议首先尝试一个更简单的正则表达式,在不同的测试中打破原来的正则表达式以解决问题:
<img\s[^>]+/> // test without look-ahead
<img(?=\s)[^>]+/> // test with positive look-ahead
<img(?!\S)[^>]+/> // test with negative look-ahead
<img((?!\S))[^>]+/> // negative look-ahead in parentheses
<img\s(?![^>]+alt=["'])[^>]+/> // your intention, expressed differently
通过这种方式,您可以找到导致错误的原因。
通过OP自己的声明,在正则表达式中使用预见会导致错误,因此这个正则表达式引擎不支持显式提前。
为了仅匹配不包含<img>
属性的alt
个标签,环视不是绝对。我提出了一个不同的方法:
<img\s(a[^l]|al[^t]|alt\s*[^=]|[^a>])*> // literal form <img\s(a[^l]|al[^t]|alt\s*[^=]|[^a>])*> // XML-encoded form
对这只小野兽的信任是:J.F. Sebastian。以下是解释:
<img\s ....... start of img tag ( ....... start of alternatives: either a[^l] ....... "a", not followed by "l" | ....... or al[^t] ....... "al", not followed by "t" | ....... or alt\s*[^=] ....... "alt", not followed by an equals sign | ....... or [^a>] ....... neither "a" nor ">" )* ....... end of alternatives, repeat as often as possible > ....... end of image tag
标准免责声明适用:正则表达式不是处理HTML的最佳工具。使用风险由您自己承担。
答案 1 :(得分:0)
嗯!只有第一次测试通过。 是的,问题似乎从paranthes开始。
明天会更多地了解它。谢谢到目前为止。
Ť