2011-12-15 3 views
5

Я работаю со следующим (неоптимальной) XML:Использование количества XPath() с содержит()

<a> 
    <b> 
    <c>X:1 Y:0</c> 
    <c>X:1 Y:0</c> 
    <c>X:2 Y:0</c> 
    </b> 
    <b> 
    <c>X:1 Y:0</c> 
    <c>X:2 Y:0</c> 
    </b> 
</a> 

Я пытаюсь использовать XPath для подсчета количества <c> узлов, содержимое которых содержат X:1:

count(contains(/a/b/c, 'X:1')) 

Однако это возвращает ошибку, а не возвращает ожидаемое количество 3.

Что я делаю неправильно?

+1

Это один из тех случаев, когда я был бы склонен предложить предварительную обработку вашего XML с таблицей стилей, которая расширяет эти элементы до '' и т. д., тогда обработка данных, подобных этому, становится тривиальной. Если это всего лишь однократная задача, то это, вероятно, не стоит, но если это то, что вам нужно сделать много, это определенно стоит рассмотреть возможность получения данных в более удобную для пользователя форму. – Flynn1179

ответ

8

Это не так, как вы используете . Попробуйте

count(/a/b/c[contains(., 'X:1')]) 
+0

Это сработало отлично, спасибо! – gjb

+0

@gjb, @Phil Больше похоже: «Это не то, как вы используете' count() '", поскольку проблема заключалась в том, что 'count()' принимает узел, заданный как параметр, но 'contains()' возвращает логическое значение , – jasso

+0

@jasso 'contains()' ожидает, что аргумент один должен быть строкой, а не узлом, поэтому было действительно две проблемы: – Phil

3

Возможно немного более эффективным (если свойство проявляется в предоставленном документе XML не является случайным):

count(/a/b/c[starts-with(., 'X:1')]) 
+0

пропущена закрывающая скобка – newtover

+0

@newtover: Хорошая добыча, спасибо. Исправлено. –

+0

+1 за ваше предложение, но я боюсь, что заказ может иногда меняться. – gjb

Смежные вопросы