Подтвердить что ты не робот

XPath с регулярным выражением по значению атрибута

Все -

Я искал и часами цеплялся, пытаясь взломать этот, но у меня все еще есть проблемы. У меня есть данные XML ниже:

<game id="2009/05/02/arimlb-milmlb-1" pk="244539">
  <team id="109" name="Arizona" home_team="false">
    <event number="9" inning="1" description="Felipe Lopez doubles to left fielder Chris Duffy.  "/>
    <event number="15" inning="1" description="Augie Ojeda flies out to center fielder Mike Cameron.  "/>
    <event number="23" inning="1" description="Chad Tracy doubles to right fielder Joe Sanchez.  "/>
    <event number="52" inning="2" description="Mark Reynolds lines out to left fielder Chris Duffy.  "/>
    <!-- more data here -->
  </team>
</game>

Я пытаюсь получить общее количество узлов событий, которые содержат текст "удваивается" в значении атрибута описания. Это то, что я пытался до сих пор, безрезультатно (irb вызывает ошибку):

"/game/team/event/@description[matches(.,' doubles ')]"

Так как я просто пытаюсь сопоставить фрагмент значения атрибута description, возможно использовать функцию XPath 2.0 'matches', правильно? Если да, то что я делаю неправильно?

Заранее благодарим за помощь!

4b9b3361

Ответ 1

Я пытаюсь получить общее количество узлы событий, которые содержат текст ' удваивает "значение атрибут описания.

matches() - стандартная функция XPath 2.0. Он недоступен в XPath 1.0.

Вы можете использовать:

count(/*/*/event[contains(@description, ' doubles ')])

Чтобы проверить это, здесь представлено небольшое XSLT-преобразование, которое просто выводит результат оценки вышеупомянутого выражения XPath в предоставленном XML-документе:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>


 <xsl:template match="/">
  <xsl:value-of select=
  "count(/*/*/event[contains(@description, ' doubles ')])"/>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному XML-документу:

<game id="2009/05/02/arimlb-milmlb-1" pk="244539">
    <team id="109" name="Arizona" home_team="false">
        <event number="9" inning="1" description="Felipe Lopez doubles to left fielder Chris Duffy.  "/>
        <event number="15" inning="1" description="Augie Ojeda flies out to center fielder Mike Cameron.  "/>
        <event number="23" inning="1" description="Chad Tracy doubles to right fielder Joe Sanchez.  "/>
        <event number="52" inning="2" description="Mark Reynolds lines out to left fielder Chris Duffy.  "/>
        <!-- more data here -->
    </team>
</game>

требуется, правильный результат получается:

2

Ответ 2

Попробуйте следующие варианты:

/game/team/event[matches(@description, ' doubles ')]/@description

/game/team/event[matches(@description, '^.*?doubles.*$')]/@description

/game/team/event[contains(@description, ' doubles ')]/@description

Ответ 3

Поскольку я просто пытаюсь сопоставить фрагмент значения атрибут описания, возможно использовать функцию XPath 2.0 'matches', правильно?

Да, если вы используете механизм XPath 2.0 для оценки выражения XPath.

Если вы должны были выполнить этот XPath с помощью механизма XPath 2.0, он выберет соответствующие атрибуты @description.

Если да, то что я делаю неправильно?

Если вы используете движок XPath 2.0, ваша проблема может заключаться в том, что вы выбрали последовательность узлов, но ожидаете подсчет.

Если вы хотите вернуть количество этих атрибутов, вы можете использовать функцию count():

count(/game/team/event/@description[matches(.,' doubles ')])