【问题标题】:How to configure regex in XSLT so it doesn't match entity reference?如何在 XSLT 中配置正则表达式使其与实体引用不匹配?
【发布时间】:2017-04-10 00:42:38
【问题描述】:

我正在构建一个 XSLT 2.0 样式表,它接受类似于 markdown 的输入并输出 XDP 内容(PDF 内容的 Adob​​e XML 表示)。

为了允许特殊字符,例如 * 或 [,它们可以在输入中分别编码为 \* 或 \[。

在处理降价之前,我将此类转义序列转换为它们的实体引用,例如\* 到 *和 \[ 到 [,目的是它们不会被需要匹配文字 * 或 [ 字符的正则表达式匹配,例如。

编辑。我认为问题出在 [ 和 ] 上,但正如我所指出的,编码为实体并不像我想象的那样工作,它们的匹配方式相同。

我正在研究可能对这些值进行双重编码。例如:将 \* 替换为 *

在XSLT输出中,有没有办法去掉这种双重编码,使其输出为*?

【问题讨论】:

  • 我会避开实体和任何涉及与号的东西。还有许多其他选择不会与竞争约定冲突,例如用§42§替换*。
  • 谢谢。我又想了想,得出了同样的结论。

标签: regex xml xslt xslt-2.0


【解决方案1】:

您的不匹配正则表达式字符串包含错误:

regex="\*(.+?)\1"

最后的\1 应该是另一个\*。更正显示预期的输出

<match>[my text]</match>
<match>*my text*</match>

【讨论】:

    【解决方案2】:

    正如 Michael Kay 建议的那样,一个行之有效的解决方案是避免使用实体和任何涉及 & 符号的东西。

    在输入中,匹配§(\d+)§之类的表达式,然后匹配输出与代码点对应的字符串:

    <xsl:sequence select="codepoints-to-string(xs:integer(regex-group(1)))" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多