XSL字符替换()

4

我有一个带有一些数据的节点:

<something>Blah blah (Hello World) hihi</something>

当我执行XSLt时,我试图转义开放和关闭括号,但是我无论如何都无法弄清楚如何实现这一点,到目前为止,我正在尝试像这样的东西。

<xsl:variable name="rb">(</xsl:variable>
<xsl:message><xsl:value-of select="replace(something, $rb, concat('\\', $rb))" /</xsl:message>

我使用Saxon时遇到了这个错误:

something.xml第728行第34列的xsl:template出现错误: FORX0002:正则表达式“(”中的第1个字符出现错误,应为“)”

3个回答

3

这适用于AltovaXML20011(XML-SPY):

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>  
 <xsl:template match="/">
  <xsl:sequence select="replace(replace(., '\(', '\\(' ), '\)', '\\)' )"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<something>Blah blah (Hello World) hihi</something>

所需的结果已产生:

Blah blah \(Hello World\) hihi

一定是Saxon的Bug。在Saxon 9.3 (HE/PE/EE)中运行良好。 - Daniel Haley
@DevNull:不幸的是,我在工作中没有Saxon 9.x,也许今早在家里我用Saxon运行了一些不同的东西... - Dimitre Novatchev

2
<xsl:variable name='string'>Blah blah (Hello World) hihi</xsl:variable>

<xsl:message>
  <xsl:value-of select="replace($string, '(\(|\))','\\$1')" />
</xsl:message>

这将适用于任何括号。你的代码也不完整。什么是 something?它是否包含您期望的值?在 xsl:value-of 的结尾处缺少一个 >。

编辑:在 @Dimitre 的评论之后:

<xsl:variable name="rb">(</xsl:variable>
<xsl:variable name='string'>Blah blah (Hello World) hihi</xsl:variable>

<xsl:message>
  <xsl:value-of select="replace($string, concat('\', $rb), concat('\\', $rb))" />
</xsl:message>

上述方法可以得到你最初想要的结果,但我认为没有理由选择它而不是我的原始解决方案。

@_FailedDev: OP的问题在于他无法将字符串 (字面上) "\(" 指定为第三个参数。你的解决方案是一个巧妙的变通方法,但它并没有回答如何将确切的该字符串指定为 replace() 的第三个参数的问题。 - Dimitre Novatchev
@DimitreNovatchev 你可能是对的,但如果OP接受了我的答案,我会认为他认为它确实回答了他的问题。此外,问题在于replace()的第二个参数,而不是第三个参数。 - FailedDev
@_FailedDev:是的,但你的回答仍然没有解释问题,也没有纠正问题——它只是一个解决方法。我相信我的回答更接近OP所问的问题。 - Dimitre Novatchev

0
<xsl:template match="text">
       <xsl:variable name="tex" select="' blabla ? blabl ?  abla ?  '"/>
       <xsl:element name="text">
           <xsl:value-of select="replace($tex,'\?','.')"/>
       </xsl:element>
   </xsl:template>

@imran,感谢您的回答,但是这个问题已经在6年前被提出了。我会投票关闭自己的问题。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接