XPath с соответствием регулярному выражению для значения атрибута - PullRequest
42 голосов
/ 08 мая 2011

Все -

Я искал и возился часами, пытаясь взломать этот, но у меня все еще есть проблемы.У меня есть данные 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>

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

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

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

Заранее спасибо за любую помощь!

Ответы [ 3 ]

34 голосов
/ 08 мая 2011

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

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
9 голосов
/ 08 мая 2011

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

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

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

/game/team/event[contains(@description, ' doubles ')]/@description
1 голос
/ 08 мая 2011

Так как я просто пытаюсь соответствовать фрагмент значения Атрибут описания, это возможно использовать функцию XPath 2.0 «спички», верно?

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

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

Если так, что я делаю не так?

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

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

count(/game/team/event/@description[matches(.,' doubles ')])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...