2012-06-01 3 views
2

Я новичок в XQuery, и я просто хотел проверить и убедиться, что я сделал там первые несколько проблем правильно и посмотреть, есть ли какая-либо обратная связь.XQuery простые вопросы в первый раз

элементы Поиск принтеров с ценой менее 100

let $products := doc("products.xml") 
for $e in $products/Products/Maker/Printer 
where $e/Price < 100 
return $e 

Сделайте то же самое, но теперь производят последовательность этих элементов в окружении тега.

let $products := doc("products.xml") 
for $e in $products/Products/Maker/Printer 
where $e/Price < 100 
return <CheapPrinters>$e</CheapPrinters> 

products.xml

<Products> 
<Maker name = "A"> 
    <PC model = "1001" price = "2114"> 
    <Speed>2.66</Speed> 
    <RAM>1024</RAM> 
    <HardDisk>250</HardDisk> 
    </PC> 
    <PC model = "1002" price = "995"> 
    <Speed>2.10</Speed> 
    <RAM>512</RAM> 
    <HardDisk>250</HardDisk> 
    </PC> 
    <Laptop model = "2004" price = "1150"> 
    <Speed>2.00</Speed> 
    <RAM>512</RAM> 
    <HardDisk>60</HardDisk> 
    <Screen>13.3</Screen> 
    </Laptop> 
    <Laptop model = "2005" price = "2500"> 
    <Speed>2.16</Speed> 
    <RAM>1024</RAM> 
    <HardDisk>120</HardDisk> 
    <Screen>17.0</Screen> 
    </Laptop> 
</Maker> 
<Maker name = "E"> 
    <PC model = "1011" price = "959"> 
<Speed>1.86</Speed>  
<RAM>2048</RAM>  
<HardDisk>160</HardDisk> 
    </PC> 
    <PC model = "1012" price = "649"> 
<Speed>2.80</Speed>  
<RAM>1024</RAM>  
<HardDisk>160</HardDisk> 
    </PC> 
    <Laptop model = "2001" price = "3673"> 
<Speed>2.00</Speed> 
<RAM>2048</RAM>  
<HardDisk>240</HardDisk> 
<Screen>20.1</Screen> 
    </Laptop> 
    <Printer model = "3002" price = "239"> 
    <Color>false</Color> 
    <Type>laser</Type> 
    </Printer> 
</Maker>  
<Maker name = "H"> 
    <Printer model = "3006" price = "100"> 
    <Color>true</Color> 
    <Type>ink-jet</Type> 
    </Printer>  
    <Printer model = "3007" price = "200"> 
    <Color>true</Color> 
    <Type>laser</Type> 
    </Printer> 
</Maker> 
</Products> 

ответ

1

Фильтрация результатов

элементы Поиск принтера с ценой менее 100

Там нет принтеров дешевле, чем 100 долларов. Для моих примеров я использовал 200. :)

Вы запрашиваете элемент, а не атрибут. Добавьте имя @ перед именем атрибута. Кроме того, XQuery чувствителен к регистру, вы должны будете использовать @price:

let $products := doc("products.xml") 
for $e in $products/Products/Maker/Printer 
where $e/@price < 200 
return $e 

Вы также можете попробовать более короткий XPath эквивалент (который является подмножеством XQuery):

doc("products.xml")/Products/Maker/Printer[@price<200] 

Элемент строительство

Сделайте то же самое, но теперь создайте последовательность этих элементов, окруженную тегом.

Теперь вам нужно будет использовать «настоящий» XQuery. Вы, в пример, в основном точны (кроме ошибки, зафиксированной выше), но в настоящее время вы вернете «$ e» для каждой строки. Есть два способа построения элементов, а также посмотреть на эту handy tutorial:

  1. Фигурные скобки

    return <CheapPrinters>{$e}</CheapPrinters>

  2. Элемент Конструкторы

    return element {"CheapPrinters"} {$e}

+0

Очень хорошо Спасибо! –

+0

Несколько замечаний: 1. Вместо 'where $ e/@ price <200' более целесообразно использовать:' где $ e/@ price lt 200'. 2. Неверно, что '@price> 100' эквивалентно' @price <100'. Замечание 1. также имеет значение здесь. Помимо этих второстепенных вопросов, ответ в порядке - ни downvoting, ни upvoting. –

+0

@DimitreNovatchev 1. '<' и 'lt' эквивалентны здесь, поскольку [узел XML не может иметь один и тот же атрибут дважды] (http://www.w3.org/TR/2006/REC-xml11-20060816/#attdecls). Но это, вероятно, очень хороший шанс указать @BumSkeeter на [различия между операторами сравнения] (http://www.w3schools.com/xquery/xquery_syntax.asp). 2. Спасибо, что указали на опечатку в эквиваленте XPath! Слишком много копировать/вставлять при установке в stackoverflow. :) –

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