【问题标题】:Replace HTML tags in CDATA替换 CDATA 中的 HTML 标签
【发布时间】:2009-01-18 14:20:40
【问题描述】:

我想替换 CDATA 元素中的一些 HTML 标记,但我很难在 XSLT 中正确使用语法。我收到此错误消息:

net.sf.saxon.trans.XPathException: Error at character 9 in regular 
expression "<img(\s+(?![^<>]*alt=["\'])[^<...": expected ()) (line 51)

我猜它不喜欢正则表达式中的&lt;&gt;。 有谁知道如何在 XSLT 中编写这个?

这是正则表达式:

<xsl:variable name="imgTagWithoutAltAttributePattern">
<xsl:text disable-output-escaping="yes">&lt;img(\s+(?![^&lt;&gt;]*alt=["\'])[^&lt;&gt;]+)/&gt;</xsl:text></xsl:variable>

【问题讨论】:

  • 您的源 XML 是什么样的?

标签: regex xslt


【解决方案1】:

我不认为转义的&lt;&gt; 括号是问题的根源。

查看错误消息,错误在 char 9 处,其中需要右括号 ")"

<img(\s+(?![^<>]*alt=["\'])[^<...
--------^

如您所见,"&amp;lt;&amp;gt;" 的输出很好。我怀疑正则表达式引擎无法以其他方式理解正则表达式(可能是负前瞻问题?)。

我建议首先尝试一个更简单的正则表达式,在不同的测试中分解你原来的正则表达式以找出问题:

<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自己的说法,在正则表达式中使用look-ahead会导致错误,所以这个regex引擎显然不支持look-ahead。

仅匹配包含alt属性的&lt;img&gt;标签绝对需要环视。我提出了一种不同的方法:

])*> // 文字形式 <img\s(a[^l]|al[^t]|alt\s*[^=]|[^a>])*> // XML 编码的表单

这个小野兽的功劳归于:J.F. Sebastian。解释如下:

] .......既不是“a”也不是“>” )* ....... 替代方案结束,尽可能多地重复 > ....... 图像标签结束

适用标准免责声明:Regex 不是处理 HTML 的最佳工具。使用风险自负。

【讨论】:

    【解决方案2】:

    嗯!只有第一次测试通过了。 是的,问题似乎是从括号开始的。

    明天会更深入地研究它。到目前为止,谢谢。

    T

    【讨论】:

    • 我认为 XSLT 正则表达式不支持前瞻。
    猜你喜欢
    • 2013-07-03
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多