XML/XQuery/if

Материал из Web эксперт
Перейти к: навигация, поиск

Conditional expression

File: Data.xml
<order>
  <car model="A">
    <id>0001</id>
    <name language="en">name 1</name>
  </car>
  <car model="B">
    <id>0002</id>
    <name language="en">name 2</name>
  </car>
  <car model="B">
    <id>0003</id>
    <name language="en">name 3</name>
  </car>
</order>
File: Query.xquery
for $prod in (doc("Data.xml")/order/car)
return if ($prod/@model = "ACC")
       then <accessoryid>{data($prod/id)}</accessoryid>
       else <otherid>{data($prod/id)}</otherid>
Output:
<?xml version="1.0" encoding="UTF-8"?>
<otherid>0001</otherid>
<otherid>0002</otherid>
<otherid>0003</otherid>



Conditional expression returning multiple expressions

File: Data.xml
<order>
  <car model="ACC">
    <id>0001</id>
    <name language="en">name 1</name>
    <colorChoices>navy black</colorChoices>
  </car>
  <car model="BCC">
    <id>0002</id>
    <name language="en">name 2</name>
  </car>
  <car model="BCC">
    <id>0003</id>
    <name language="en">name 3</name>
  </car>
</order>
File: Query.xquery
for $prod in (doc("Data.xml")/order/car)
return if ($prod/@model = "ACC")
       then (<accessoryid>{data($prod/id)}</accessoryid>,
            <accessoryName>{data($prod/name)}</accessoryName>)
       else <otherid>{data($prod/id)}</otherid>
Output:
<?xml version="1.0" encoding="UTF-8"?>
<accessoryid>0001</accessoryid>
<accessoryName>name 1</accessoryName>
<otherid>0002</otherid>
<otherid>0003</otherid>



Converting values without a lookup table

File: Data.xml
<order>
  <car model="A">
    <id>0001</id>
    <name language="en">name 1</name>
  </car>
  <car model="B">
    <id>0002</id>
    <name language="en">name 2</name>
  </car>
  <car model="B">
    <id>0003</id>
    <name language="en">name 3</name>
  </car>
</order>
File: Query.xquery
let $cat := doc("Data.xml")/order
for $model in distinct-values($cat/car/@model)
return  <li>Department: {if ($model = "B")
                        then "Accessories"
                        else if ($model = "C")
                             then "Menswear"
                             else if ($model = "A")
                                  then "Womens"
                                  else ()
               }  ({$model})</li>
Output:
<?xml version="1.0" encoding="UTF-8"?>
<li>Department: Womens  (A)</li>
<li>Department: Accessories  (B)</li>



If statement in return clause

File: Data.xml

<order>
  <car model="A">
    <id>0001</id>
    <name language="en">name 1</name>
  </car>
  <car model="B">
    <id>0002</id>
    <name language="en">name 2</name>
  </car>
  <car model="B">
    <id>0003</id>
    <name language="en">name 3</name>
  </car>
</order>

File: Query.xquery
let $prods := doc("Data.xml")//car
     let $idProds := count($prods)
     for $prod at $count in $prods
     return if ($count = $idProds)
            then concat($prod/name,".")
            else concat($prod/name,",")
Output:
<?xml version="1.0" encoding="UTF-8"?>name 1, name 2, name 3.



If then else stateCt

File: Data.xml
<prices>
  <priceList effDate="2006-11-15">
    <prod num="1">
      <price currency="USD">29.99</price>
      <discount type="CLR">10.00</discount>
    </prod>
    <prod num="2">
      <price currency="USD">69.99</price>
    </prod>
    <prod num="3">
      <price currency="USD">39.99</price>
      <discount type="CLR">3.99</discount>
    </prod>
  </priceList>
</prices>

File: Query.xquery

let $bargains := doc("Data.xml")/prices/priceList/prod[price < 30]
return if ($bargains)
       then <bargain-bin>{$bargains}</bargain-bin>
       else ()

Output:
<?xml version="1.0" encoding="UTF-8"?>
<bargain-bin>
   <prod num="1">
      <price currency="USD">29.99</price>
      <discount type="CLR">10.00</discount>
    </prod>
</bargain-bin>



Nested conditional expressions

File: Data.xml
<order>
  <car model="ACC">
    <id>0001</id>
    <name language="en">name 1</name>
  </car>
  <car model="BCC">
    <id>0002</id>
    <name language="en">name 2</name>
  </car>
  <car model="BCC">
    <id>0003</id>
    <name language="en">name 3</name>
  </car>
</order>

File: Query.xquery
for $prod in (doc("Data.xml")/order/car)
return if ($prod/@model = "ACC")
       then <accessory>{data($prod/id)}</accessory>
       else if ($prod/@model = "WMN")
            then <womens>{data($prod/id)}</womens>
            else if ($prod/@model = "MEN")
                 then <mens>{data($prod/id)}</mens>
                 else <other>{data($prod/id)}</other>
Output:
<?xml version="1.0" encoding="UTF-8"?>
<accessory>0001</accessory>
<other>0002</other>
<other>0003</other>