2010-03-28 2 views
2

У меня есть файл XML:Как указать «отсутствующие» теги в XQuery?

$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 

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

ответ

0

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

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

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

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

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

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

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

1

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

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

/xml/element[not(*)] 
0

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

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

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

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

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

http://demo.exist-db.org/exist/sandbox/sandbox.xql