как обрабатывать "<" и ">" в регулярных выражениях в xslt - PullRequest
2 голосов
/ 02 апреля 2012

У меня есть строка в XML, <italic>a</italic>, и я использую xsl:analyze-string, чтобы извлечь все курсивные слова с этим шаблоном: "<italic>a</italic>".Я знаю, что могу использовать сопоставление с шаблоном курсивом, но здесь необходимо сопоставить его с помощью регулярных выражений.Я пытаюсь написать такое выражение, (<italic>)[a-z]+</italic>, но процессор XSLT выдает ошибку при открытии тега <.

Есть идеи, как обрабатывать открывающие и закрывающие теги в регулярном выражении?

Ответы [ 3 ]

3 голосов
/ 02 апреля 2012

Вы еще не сказали, как выглядит ваш источник XML, но если <italic>a</italic> является обычным элементом XML, то вы не можете сопоставить лексическую форму элемента с помощью регулярных выражений. Это потому, что входные данные для XSLT - это дерево узлов, а не строка лексической разметки XML . Эта концепция абсолютно необходима для понимания работы XSLT.

1 голос
/ 02 апреля 2012

Пока <italic>a</italic> является действительной строкой, вы можете использовать &lt; для символа <.Больше чем (>) не нужно экранировать.

Пример:

Пример ввода XML

<test><![CDATA[<italic>a</italic>]]></test>

XSLT2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/">
    <xsl:analyze-string select="test" regex="&lt;italic>([^&lt;]+)&lt;/italic>">
      <xsl:matching-substring>
        <results>
          <xsl:value-of select="regex-group(1)"/>
        </results>
      </xsl:matching-substring>
    </xsl:analyze-string>
  </xsl:template>

</xsl:stylesheet>

Вывод XML:

<results>a</results>
0 голосов
/ 12 апреля 2012

<italic>a</italic> - это обычный элемент xml, если вы используете процессор saxon xslt, то используйте функцию расширений net.sf.saxon.serialize для сериализации xml, а затем примените регулярное выражение.Отлично работает.

...