Проблема XSLT: регулярные выражения для значений атрибутов - PullRequest
0 голосов
/ 04 октября 2018

Рассмотрим следующий XML:

<?xml-stylesheet type="text/xsl" href="eclas.xsl"?>

  <collection>
    <record>
      <datafield tag="150">
        <subfield code="a">Abandon des études</subfield><!--accepted FR-->
        <subfield code="9">fre</subfield>
      </datafield>
      <datafield tag="150">
        <subfield code="a">Student drop-out</subfield><!--accepted EN-->
        <subfield code="9">eng</subfield>
      </datafield>
      <datafield tag="450">
        <subfield code="a">Décrochage scolaire</subfield><!-- NOT accepted term FR-->
        <subfield code="9">fre</subfield>
      </datafield>
      <datafield tag="450">
        <subfield code="a">Abandon scolaire</subfield><!-- NOT accepted term FR-->
        <subfield code="9">fre</subfield>
      </datafield>
      <datafield tag="450">
        <subfield code="a">Abandon de la scolarité</subfield><!-- NOT preferred term FR-->
        <subfield code="9">fre</subfield>
      </datafield>
    </record>
    <record>
      <datafield tag="151">
        <subfield code="a">Egypte</subfield>
        <subfield code="9">fre</subfield>
      </datafield>
      <datafield tag="151">
        <subfield code="a">Egypt</subfield>
        <subfield code="9">eng</subfield>
      </datafield>
      <datafield tag="451">
        <subfield code="a">République arabe d&apos;Egypte</subfield>
        <subfield code="9">fre</subfield>
      </datafield>
      <datafield tag="451">
        <subfield code="a">République arabe unie</subfield>
        <subfield code="9">fre</subfield>
      </datafield>
      <datafield tag="451">
        <subfield code="a">United Arab Republic</subfield>
        <subfield code="9">eng</subfield>
      </datafield>
    </record>
</collection>

Это образец из большого тезауруса.Мне нужна помощь с моим регулярным выражением, которое может выбирать между 150, 151, 450 или 451.

Вот код xslt, с которым у меня проблемы:

<xsl:for-each select="datafield[contains(@tag, '150|151' )]">
...
</xsl:for-each>

Я пытаюсь выполнить циклнад элементами поля данных, которые имеют 150 или 151 в качестве значения.Мое регулярное выражение не похоже на работу.Я пробовал несколько вещей безрезультатно.

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Функция contains не принимает регулярное выражение в качестве второго аргумента, просто простая строка, которую она проверяет, находится в первой строке или нет.Вы должны использовать matches ...

 <xsl:for-each select="datafield[matches(@tag, '^150$|^151$')]">

Или чуть лучше ...

<xsl:for-each select="datafield[matches(@tag, '^(150|151)$')]">

Обратите внимание на дополнительные символы, чтобы предотвратить совпадение, например, с "1500".

Однако matches - это только XSLT 2.0, а использование <?xml-stylesheet предполагает, что вы выполняете преобразование в браузере, которое на самом деле будет только XSLT 1.0.Если это так, тогда вы можете использовать contains с небольшим дополнительным усилием

<xsl:for-each select="datafield[contains('|150|151|', concat('|', @tag, '|') )]">

Опять же, дополнительное использование | заключается в том, чтобы предотвратить, например, 1500.

0 голосов
/ 06 октября 2018

Требуется сопоставить одну из следующих 4 строк: 150 , 151 , 450 и 451 .Обратите внимание:

  • первый символ - либо 1, либо 4,
  • , второй символ всегда 5,
  • и последний символлибо 0, либо 1.

Таким образом, регулярное выражение, соответствующее всем им, равно ^[14]5[01]$.

Я поставил якоря ^ и $, чтобы предотвратитьсопоставление такой строки как части более длинного текста (например, 31508 ).

Итак, в XSLT 2.0 вы можете написать:

<xsl:for-each select="datafield[matches(@tag, '^[14]5[01]$')]">
0 голосов
/ 04 октября 2018

contains() принимает строку, а не регулярное выражение в качестве второго параметра, поэтому ваш код ищет строку 150|151.Вы не можете делать регулярные выражения в XSLT 1.0.Однако с помощью функции choose() вы можете сделать несколько contains().См. этот вопрос для получения дополнительной информации.

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