XSL Замена символов ( )

#xslt

#xslt

Вопрос:

У меня есть узел с некоторыми данными:

 <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:

Ошибка в xsl: шаблон в строке 728, столбец 34 из something.xml : FORX0002: Ошибка в символе 1 в регулярном выражении «(«: ожидаемый ())

Ответ №1:

Это работает с 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
 

Комментарии:

1. «Должно быть, саксонская ошибка». — Это прекрасно работает в Saxon 9.3 (HE / PE / EE).

2. @DevNull: К сожалению, у меня нет Saxon 9.x на работе, возможно, ранее этим утром дома я запустил что-то другое с Saxon…

Ответ №2:

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

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

Это будет работать для любой скобки. Ваш код также является неполным. Что такое что-то? Содержит ли он ту ценность, которую вы ожидаете? Вам не хватает a> в конце 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>
 

Вышеприведенное привело бы к результатам, которые вы изначально хотели, хотя я не вижу причин предпочитать это моему первоначальному решению.

Комментарии:

1. @_FailedDev: проблема OP в том, что он не может указать строку (буквально) "(" в качестве третьего аргумента. Ваше решение является разумным обходным путем, однако оно не отвечает на вопрос, как указать эту точную строку в качестве третьего аргумента replace() .

2. @DimitreNovatchev Возможно, вы правы, однако, если ОП примет мой ответ, я бы предположил, что он посчитал, что он действительно ответил на его вопрос. Кроме того, проблема заключается во втором аргументе replace(), а не в третьем.

3. @_FailedDev: Да, но ваш ответ по-прежнему не объясняет проблему и не устраняет проблему — это обходной путь. Я считаю, что мой ответ ближе к тому, что задает OP.

Ответ №3:

 <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>
 

Комментарии:

1. @imran, спасибо за ваш вклад, однако этот вопрос был задан более 6 лет назад. Я буду голосовать, чтобы закрыть свой собственный вопрос