2016-05-31 2 views
0

У меня есть XML-файл, к которому я пытаюсь извлечь заголовки книг и журналов элементов, в которых соответствующий комментарий по ID и IDREF не имеет значения в комментариях.XQuery найти элемент, где дочерний атрибут соответствия пуст

Так файл XML я должен выглядеть примерно так:

<bookshop> 
    <product ID="185.3.16"> 
     <price currency="AU$">56.85</price> 
     <comments>Best sell</comments> 
    </product> 
    <product ID="163.24.12"> 
     <price currency="NZ$">28.6</price> 
     <comments /> 
    </product> 
    <product ID="332.17.25"> 
     <price currency="US$">19.95</price> 
     <comments></comments> 
    </product> 
    <book IDREF="163.24.12"> 
     <title>Core Java</title> 
    </book> 
    <book IDREF="185.3.16"> 
     <title>C++ Development</title> 
    </book> 
    <journal IDREF="332.17.25"> 
     <title>Mathematics and Computing</title> 
    </journal> 
</bookshop> 

И выход я пытаюсь достичь:

<title>Core Java</title> 
<title>Mathematics and Computing</title> 

, потому что книга C++ IDREF Развитие соответствует идентификатор продукт, чьи детские комментарии не имеют значения.

Я попытался создать сценарий, используя xquery, чтобы сделать это, пытаясь найти все элементы с отдельным атрибутом идентификатора, где его дочерний комментарий также пуст, но у меня возникают проблемы с попыткой найти продукты без комментарии, а затем перевод этих результатов во что-то, что я могу вернуть. (Я не могу дать возвращающему надлежащие идти, пока я не могу решить продукты, так что я не был в состоянии сделать много свободы действий с этим.) Но вот что я пытался до сих пор:

for $id in distinct-values(//product/@ID) 
where count(//product/comments/text()) > 0 
return ...? 

Любая помощь приветствуется.

Заранее благодарен!

ответ

0

«Я пытаюсь извлечь заголовки из элементов книг и журналов, где продукт соответствия по ID и IDREF не имеет значения в комментариях»

Это один возможный XPath для вернуть то, что вы описали в вопросе:

/bookshop/*[@IDREF = /bookshop/product[normalize-space(comments) = '']/@ID]/title 

Если вы хотите конкретно выбрать либо только book или journal, просто добавьте предикат: [self::book | self::journal] после /*.

xpathtester demo

выход:

<title>Core Java</title> 

<title>Mathematics and Computing</title> 

UPDATE:

Не ясно, о limitatio n (какое выражение XPath вы не можете использовать). Предполагая, что вы не можете использовать XPath предикат ([]), он может быть заменен where пунктом как следующие:

declare variable emptyProductIDs := /bookshop/product[not(comments/text())]/@ID 

for $element in /bookshop/* 
where $element/@IDREF = $emptyProductIDs 
return $element/title 
+0

Столько, сколько я хотел бы использовать XPath, я ограничен XQuery для данного конкретного случая использования – SteppingHat

+0

XPath - это подмножество XQuery ... вы пробовали? – har07

+0

Да, но этот вопрос является частью небольшой части университетского задания, что требует от меня использования xquery без участия xpath. К сожалению, я не могу использовать xpath столько, сколько захочу. – SteppingHat

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