# xquery - nodes unterscheiden sich nur durch attribute :-(



## guni (11. Sep 2009)

hallo,

kennt sich irgendwer hier gut mit xquery aus?
bin neu in der thematik und hab ein xml mit mitarbeiterdaten einer firma.
das design des xml's ist schrecklich:
[XML]
<record>
<field name="firstname"><string>Brad</string></field>
<field name="lastname"><string>Pitt</string></field>
<field name="employeenumber"><string>123</string></field>
<field name="gender"><string>m</string></field>
</record>
<record>
<field name="firstname"><string>George</string></field>
<field name="lastname"><string>Clooney</string></field>
<field name="employeenumber"><string>456</string></field>
<field name="gender"><string>m</string></field>
</record>
<record>
<field name="firstname"><string>Angelina</string></field>
<field name="lastname"><string>Jolie</string></field>
<field name="employeenumber"><string>789</string></field>
<field name="gender"><string>w</string></field>
</record>
[/XML]
ich brauche irgendeine abfrage in xquery, die ungefähr folgendes macht:

select firstname, lastname, employeenumber
from employees
where firstname in ('Angelina', 'Brad');

bitte um hilfe!
danke.


----------



## ModellbahnerTT (11. Sep 2009)

irgendwie so:


```
for $rec in doc("foo.xml")//record
let $first = data($rec/field[@name = "firstname"])
let $last = data($rec/field[@name = "lastname"])
let $num = data($rec/field[@name = "employeenumber"])
where $first = ("Angelina", "Brad")
return ($first, $last, $num)
```


----------



## guni (11. Sep 2009)

@Modellbahner:
danke! das hat mir schon weitergeholfen.
ganz versteh ich zwar die eckigen Klammern noch nicht, aber das lässt sich ja jetzt über tutorials herausfinden ;-)


----------



## guni (11. Sep 2009)

ok ... jetzt muss ich euch leider nochmal nerven.
ich hab ein ant-Script (xml)
und ich möchte über eine xquery rausfinden welche jars das ding einbindet.
hab bis jetzt folgende query:


```
<ul>
{
for    $target in doc("C:\build.xml")/project/target
let    $classpath := $target[@name="compile"]/javac/classpath
let    $jarfile   := data($classpath/pathelement/@location)
return <li>{$jarfile}</li>
}
</ul>
```

mein output sieht jetzt aber dummerweise so aus:

[XML]<ul>
  <li/>
  <li/>
  <li>${java.lib}/apache-mime4j-0.5.jar ${java.lib}/commons-codec-1.3.jar ${java.lib}/commons-logging-1.1.1.jar ${java.lib}/httpclient-4.0-beta2.jar ${java.lib}/httpcore-4.0-beta3.jar ${java.lib}/httpmime-4.0-beta2.jar</li>
  <li/>
  <li/>
</ul>[/XML]

wie kann ich denn erreichen,
dass ich 
a) jede jar-Datei als list element bekommen
b) den pfad vorne wegschneide

ps.: mein source-xml sieht so aus:
[XML]  <target name="compile" depends="init" description="erzeugt die class-Dateien für die Schnittstelle">
    <javac srcdir="." includes="**/*.java" destdir="${build.dir}">
      <classpath>
        <pathelement location="${java.lib}/apache-mime4j-0.5.jar"/>
        <pathelement location="${java.lib}/commons-codec-1.3.jar"/>
        <pathelement location="${java.lib}/commons-logging-1.1.1.jar"/>
        <pathelement location="${java.lib}/httpclient-4.0-beta2.jar"/>
        <pathelement location="${java.lib}/httpcore-4.0-beta3.jar"/>
        <pathelement location="${java.lib}/httpmime-4.0-beta2.jar"/>
      </classpath>
    </javac>
  </target>[/XML]


----------



## ModellbahnerTT (11. Sep 2009)

```
<ul>
{
for $target in doc("C:\build.xml")/project/target
let $classpath := $target[@name="compile"]/javac/classpath
for $location in $classpath/pathelement/@location
return <li>{ substring(data($location),12) }</li>
}
</ul>
```


----------

