【问题标题】:What escape character for fn:replace functionfn:replace 函数的转义字符是什么
【发布时间】:2020-05-20 08:36:16
【问题描述】:

我必须将坏字符更改为引号,但我无法逃脱最后一个。

这样做是不行的

<xsl:value-of select="fn:replace(prog:intitules/prog:intitule_fr,'¿', '\'')"/>

它产生 net.sf.saxon.trans.XPathException:表达式中的引号不匹配 双重或三重转义 '\' 或 '\\' 的错误相同。

我的编辑器拒绝这种替代语法:

<xsl:value-of select='fn:replace(prog:intitules/prog:intitule_fr,"¿", "'")'/>

有什么想法吗? 伯纳德

【问题讨论】:

    标签: xslt xpath saxon


    【解决方案1】:

    试试这个方法:

    <xsl:value-of select='replace(input, "¿", "&apos;")'/>
    

    【讨论】:

      【解决方案2】:

      在 XPath 2.0+ 中,您可以通过将撇号加倍来转义以撇号分隔的字符串文字中的撇号。所以试试:

      ''''
      

      当您在 XSLT 中的 XPath 中使用正则表达式时,您需要非常仔细地考虑转义。为什么角色需要转义?

      • 如果它在正则表达式中有特殊含义(例如 '(') 则使用反斜杠

      • 如果由于 XPath 规则(如此处)而不允许使用 XPath 转义(将'O'Neil' 写为'O''Neil'"a="3"""a=""3"""

      • 如果因为 XML 规则(例如“< 写成&amp;lt;

      这不起作用的原因:

      <xsl:value-of select='fn:replace(prog:intitules/prog:intitule_fr,"¿", "'")'/>
      

      是 XML 解析器将字符串文字中的撇号视为标记 select 属性值的结尾。所以这里你有一个 XML 问题,因此根据规则 3,你需要使用 XML 转义 (&amp;apos;)

      【讨论】:

      • 非常感谢(我已经花了好几个小时了!),它使用 ʼ替换或加倍撇号。太好了。
      【解决方案3】:

      假设您的文件是 utf-8 编码的,您可以尝试一种解决方法,使用 Unicode 撇号 字符(十六进制 2BC)而不是 quote(十六进制 @ 987654322@):

      <xsl:value-of select="fn:replace(prog:intitules/prog:intitule_fr,'¿', '&#x2BC;')"/>
      

      编辑:再搜索一点,我发现切换'"并使用实体&amp;apos;会得到相同的结果,正如michael.hor257k同时提出的那样:

      <xsl:value-of select='fn:replace(prog:intitules/prog:intitule_fr,"¿", "&apos;")'/>
      

      【讨论】:

      • 这不起作用,因为XML解析器在XPath解析之前扩展了字符引用,所以XPath解析器看到的是字符串文字''',它不是有效的XPath。
      • @MichaelKay:如果我提供了报价的十六进制代码 (&amp;#x27;),您的评论将是正确的,但我建议使用 &amp;#x2BC; 而不是 &amp;#x27;。我测试了它并且它有效。正如你所说,我得到了字符串文字 'ʼ' 而不是 '''。如果你放大,你会看到不同。
      • 对不起,我错过了。是的,它是有效的 XPath,唯一的问题是 OP 想要输出中的 x27 字符而不是 x2BC。鉴于他们想要它的原因,替换可能会也可能不会接受。
      • 我明白了。我提出撇号而不是引号的原因是因为他正在生成法语输出 (intitule_fr) 并且在法语(这是我的母语)中,在某些情况下使用撇号比使用引号更好。正如你所说:他会做出决定。
      • 非常感谢(我已经花了好几个小时了!),它可以使用 ʼ替换或加倍撇号。太好了。
      猜你喜欢
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 2013-10-07
      • 2020-06-24
      • 1970-01-01
      • 2019-10-25
      相关资源
      最近更新 更多