#regex #xslt
#регулярное выражение #xslt
Вопрос:
Я пытаюсь использовать XSLT для преобразования XML в обычный текст. Один из узлов содержит следующее содержимое, и мне нужно извлечь строку, которая появляется перед текстом «сбой» Я планировал использовать функцию analyze-string и у меня возникли проблемы с созданием регулярного выражения для нее. Я попытался посмотреть, могу ли я использовать шаблон lookahead, но не смог этого сделать.
Может кто-нибудь сказать, каким было бы регулярное выражение для извлечения текста в квадратных скобках перед текстом «сбой»:
Текст
[[2500, 4500]] fail(expected [[2100, 3000, 4000, 5000, 5400, 6000, 8000, 10000]])
Конечный результат
[2500, 4500]
Комментарии:
1. Хороший вопрос, 1. Смотрите мой ответ об однострочном решении XPath 1.0 и, конечно же, о решении XSLT 1.0, которое вообще не использует RegEx. 🙂 Также предоставляется объяснение.
Ответ №1:
/[([. ?])] fail/
и получаем $1
.
Комментарии:
1. Спасибо, приведенное выше регулярное выражение содержит текстовый сбой в нем. Есть ли способ исключить это, а также есть 2 уровня квадратных скобок, я надеялся, что смогу использовать только внутренний уровень. Возможно ли это?
2. Конечно. Используйте это регулярное выражение и воспользуйтесь первым уловом,
$1
.3. Я могу привести пример, если вы скажете мне, какой язык программирования вы используете.
Ответ №2:
Вы можете сделать это даже в XSLT 1.0 (как одно выражение XPath 1.0) без регулярных выражений:
substring(substring(normalize-space(substring-before(.,' fail')), 2),
1,
string-length(substring(
normalize-space(substring-before(.,' fail')),
2)
) -1
)
Поскольку ваша цель — сделать это в XSLT, вы можете определить переменные для компонентов этого сложного выражения и получить простой и понятный код:
<xsl:template match="/">
<xsl:variable name="vStart" select=
"normalize-space(substring-before(.,' fail'))"/>
<xsl:variable name="vnormString" select=
"normalize-space($vStart)"/>
<xsl:variable name="vLen" select="string-length($vnormString)"/>
"<xsl:value-of select="substring($vnormString, 2, $vLen -2)"/>"
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к следующему XML-документу:
<t>[[2500, 4500]] fail(expected [[2100, 3000, 4000, 5000, 5400, 6000, 8000, 10000]]) </t>
получен желаемый, правильный результат:
"[2500, 4500]"
Объяснение: Использование стандартных функций XPath 1.0: substring()
, substring-before()
, normalize-space()
и string-length()