Могу ли я создать значение для отсутствующего тега в XPath? - PullRequest
9 голосов
/ 02 сентября 2008

У меня есть приложение, которое извлекает данные из файла XML с использованием XPath. Если узел в этом исходном XML-файле отсутствует, я хочу вернуть значение «N / A» (очень похоже на функцию Oracle NVL). Хитрость в том, что приложение не поддерживает XSLT; Я хотел бы сделать это, используя только XPath и XPath.

Это возможно?

Ответы [ 5 ]

5 голосов
/ 03 сентября 2008

Это может быть сделано, но только если возвращаемое значение, когда узел существует, строковое значение узла, а не сам узел . XPath

substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz)))

вернет строковое значение элемента baz, если он существует, в противном случае строка "N / A".

Чтобы обобщить подход:

substring(concat($null-value, $node),
          (string-length($null-value) + 1) * number(boolean($node)))

где $null-value - строка с нулевым значением и $node выражение для выбора узла. Обратите внимание, что если $node вычисляется для набора узлов, который содержит более одного узла, используется строковое значение first node.

3 голосов
/ 03 сентября 2008

Краткий ответ: нет. Такая функция была рассмотрена и явно отклонена для версии 2 спецификации XPath (см. Ненормативный раздел «Иллюстративные пользовательские функции» ).

2 голосов
/ 04 сентября 2008

Для пустых узлов вам нужно

boolean(string-length($node))

(Вы можете опустить вызов на number(), поскольку приведение логического значения к числу подразумевается здесь.)

1 голос
/ 03 сентября 2008

@ jelovirt

Так что, если я правильно понимаю, мы объединяем ответ по умолчанию и значение узла, а затем принимаем правильное подмножество результирующей строки, проверяя наличие узла, чтобы установить смещение равным нулю или позиции сразу после моей строки по умолчанию. Это самый извращенный поворот языка, который я когда-либо видел. (Я люблю это!)

Чтобы пояснить, что вы сказали, этот подход работает, когда узел отсутствует, а не когда узел пуст. Но, заменив «number (boolean ($ node))» на «string-length ($ node)», он будет работать на пустых узлах.

1 голос
/ 03 сентября 2008

Это можно сделать с XPath 1.0. Скажем, у вас есть

<foo>
  <bar/>
</foo>

Если вы хотите проверить, есть ли у foo ребенок baz,

substring("N/A", 4 * number(boolean(/foo/baz)))

вернет "N / A", если выражение /foo/baz возвращает пустой набор узлов, в противном случае он возвращает пустую строку.

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