#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 лет назад. Я буду голосовать, чтобы закрыть свой собственный вопрос