Регулярное выражение в xsl: совпадение с шаблоном [dубликат]

Я просто хочу знать, можно ли использовать регулярные выражения в атрибуте match элемента xsl:template. Например, предположим, что у меня есть следующий XML-документ:

<greeting>
    <aaa>Hello</aaa>
    <bbb>Good</bbb>
    <ccc>Excellent</ccc>
    <dddline>Line</dddline>
</greeting>

Теперь XSLT преобразует вышеуказанный документ:

<xsl:stylesheet>

    <xsl:template match="/">
        <xsl:apply-templates select="*"/>
    </xsl:template>

    <xsl:template match="matches(node-name(*),'line')">
        <xsl:value-of select="."/>
    </xsl:template>

</xsl:stylesheet>

Когда я пытаюсь использовать синтаксис matches(node-name(*),'line$') в атрибуте match элемента xsl:template, он получает сообщение об ошибке. Можно ли использовать регулярные выражения в атрибуте match?

Большое спасибо

6
задан 4 October 2011 в 19:44

1 ответ

В XSLT 1.0 (и 2.0 тоже) для вашего примера (это не регулярное выражение):

<xsl:template match="*[contains(name(), 'line')]">
  <xsl:value-of select="."/>
</xsl:template>

и для достижения соответствия конца строки:

<xsl:template match="*[contains(concat(name(), '&#xA;'), 'line&#xA;')]">
  <xsl:value-of select="."/>
</xsl:template>

В XSLT 2.0 вы можете, конечно, использовать функцию matches() вместо contains().

5
ответ дан 15 August 2018 в 16:06
  • 1
    @Dimitre: Как вы сказали, LF не может быть частью name(). Поэтому, если вы не можете использовать XPath 2.0 (и регулярное выражение), это будет способ сопоставления имени, содержащего строку 'line' в конце, а не где угодно. Кажется, что OP это хочет, потому что он упоминает регулярное выражение 'line$', и он не указал версию XSLT, которую он использует. Я мог бы использовать пробел или любой другой символ, который является незаконным в именах. Так что это совсем не бессмысленно или неправильно. ;-) – Tomalak 21 June 2010 в 12:50
  • 2
    Хорошо, теперь я вижу. Для имен это работает. – Dimitre Novatchev 21 June 2010 в 17:59

Другие вопросы по тегам:

Похожие вопросы: