Как указать «отсутствующие» теги в XQuery? - PullRequest
2 голосов
/ 28 марта 2010

У меня есть XML-файл:

$xml := <xml>
          <element>
              <text>blahblah</text>
          </element>
          <element>
          </element>
          <element>
              <text>blahblah</text>
          </element>
      </xml>

Я могу использовать запрос

for $x in $xml/xml/element/text return string($x)

Это дает мне список

blahblah
blahblah

без указания на то, что есть элемент, который не имеет элемента. Я хотел бы использовать запрос, который, если такого элемента нет, возвращает «отсутствует». Как мне это сделать?

Ответы [ 5 ]

1 голос
/ 14 апреля 2010

Для последовательности строк (слегка измененная версия первого ответа):

for $e in $xml/xml/element
return
  if ($e/text)
  then string($e/text)
  else "missing"

или используя let (что мне немного чище ... но это, вероятно, всего 6 из полутора десятков других):

for $e in $xml/xml/element
let $text := string($e/text)
return
  if ($text)
  then $text
  else "missing"

Надеюсь, это поможет.

1 голос
/ 15 апреля 2010

Вы пытаетесь вернуть элементы "element", у которых нет дочерних элементов? (В вашем примере это второе вхождение «элемента», поскольку первый и последний содержат «текстовые» элементы.)

Если это так, вы можете использовать предикат в выражении XPath:

/xml/element[not(*)]
0 голосов
/ 26 апреля 2010

$ XML / элемент / строка ((текст, "отсутствует") [1])

  • функции разрешены в выражениях XPath, поэтому явный цикл здесь не нужен.

  • выражение (текст, «отсутствует») [1]

возвращает первый ненулевой элемент в последовательности текстового элемента, за которым следует строка «пропущено»

  • вы можете использовать песочницу eXist для выполнения фрагментов кода: -

http://demo.exist -db.org / есть / Песочница / sandbox.xql

0 голосов
/ 15 апреля 2010

в MarkLogic


for $e in $xml/xml/element
   return ($e/text,"missing")

0 голосов
/ 28 марта 2010

Это должно работать:

for $x in $xml/xml/element
return
  if (text)
  then string(text)
  else "missing"
...