xslt xsl: анализ строки и регулярное выражение - PullRequest
3 голосов
/ 29 марта 2012

У меня есть XML-файл, в котором я должен найти шаблоны и поставить "отметки вокруг соответствующего конкретного шаблона.

<xml>
<foo>
    <id>1</id>
    <description>This is section 1, this is section 1 or 2, this is section 1 and 2</description>
</foo>
</xml>

Теперь в файле я должен найти шаблон «раздел 1», «раздел 1 или 2» и «раздел 1 и 2» и поставить «отметки» вокруг соответствующего слова.

Я написал xslt, который выглядит так:

  <xsl:template match="text()">

<xsl:analyze-string select="." regex="section\s\d+|section\s\d+\s+or\s+\d|section\s\d+\s+and\s+\d">
  <xsl:matching-substring>
    <xsl:if test="matches(.,'section\s\d+')" >
      <xsl:text>"</xsl:text>
      <xsl:value-of select="."/>     
      <xsl:text>"</xsl:text>       
    </xsl:if>
    <xsl:if test="matches(.,'section\s\d+\s+or\s+\d')" >
      <xsl:text>"</xsl:text>
      <xsl:value-of select="."/>     
        <xsl:text>"</xsl:text>       
    </xsl:if>
    <xsl:if test="matches(.,'section\s\d+\s+and\s+\d')" >
      <xsl:text>"</xsl:text>
      <xsl:value-of select="."/>     
      <xsl:text>"</xsl:text>       
    </xsl:if>
  </xsl:matching-substring>
  <xsl:non-matching-substring>
    <xsl:value-of select="current()"/>
  </xsl:non-matching-substring>
</xsl:analyze-string>
 </xsl:template>

Проблема, с которой я здесь сталкиваюсь, состоит в том, что шаблон «раздел 1» также соответствует всем другим шаблонам, поэтому я не получаю желаемого результата

Результат преобразования выше

<xml>
  <foo>
      <id>1</id>
      <description>This is "section 1", this is "section 1" or 2, this is "section 1" and 2</description>
  </foo>
</xml>

где, как я хочу этот вывод.

<xml>
  <foo>
    <id>1</id>
    <description>This is "section 1", this is "section 1 or 2", this is "section 1 and 2"</description>
   </foo>
</xml>

Есть идеи, как это реализовать ... и получить желаемый результат.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 30 марта 2012

это работает на ваш ввод:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

 <xsl:template match="text()">
  <xsl:analyze-string select="." regex="section\s+\d+(\s+(or|and)\s+\d+)?">
   <xsl:matching-substring>
     <xsl:text>"</xsl:text>
     <xsl:value-of select="."/>     
     <xsl:text>"</xsl:text>       
   </xsl:matching-substring>
   <xsl:non-matching-substring>
    <xsl:value-of select="current()"/>
   </xsl:non-matching-substring>
  </xsl:analyze-string>
 </xsl:template>

</xsl:stylesheet>

Хотя, если вы просто генерируете строку, а не элементы, xsl:anayze-string - это больше, чем вам нужно, и это дает тот же результат:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

 <xsl:template match="text()">
  <xsl:value-of  select="replace(.,'section\s+\d+(\s+(or|and)\s+\d+)?','&quot;$0&quot;')"/>
 </xsl:template>

</xsl:stylesheet>
0 голосов
/ 30 марта 2012

Быстрый, но не элегантный ответ - сделать тестовые совпадения (., 'Section \ s \ d +'), а не (совпадения (., 'Section \ s \ d + \ s + или \ s + \ d'))или что-то подобное

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...