2017-10-17 21 views
0

J'ai un problème lors de l'interrogation d'une structure XML.Interroger tous les nœuds avec une valeur d'attribut spéciale

C'est le document:

<?xml version="1.0" encoding="UTF-8"?> 
<document> 
<LangSet id="1031"> 
    <field id="Language">1031</field> 
    <field id="PrimaryLanguage">7</field> 
    <Term id="18"> 
     <field id="CreatedBy">dot_Termservice</field> 
     <field id="CreatedOn">20060905T170414Z</field> 
     <field id="CreatedOnUTC">20060905T150414Z</field> 
     <field id="CreatedOrUpdatedBy">dot_Termservice</field> 
     <field id="CreatedOrUpdatedOn">20080107T141350Z</field> 
     <field id="CreatedOrUpdatedOnUTC">20080107T121350Z</field> 
     <field id="Status">Negativterm.Kunden-orientiert;Negativterm.Technik-orientiert</field> 
     <field id="Term">Innenpersenning</field> 
     <field id="TermType">MainTerm</field> 
     <field id="UpdatedBy">dot_Termservice</field> 
     <field id="UpdatedOn">20080107T141350Z</field> 
     <field id="UpdatedOnUTC">20080107T121350Z</field> 
     <field id="UserId">11817</field> 
    </Term> 
    <Term id="19"> 
     <field id="CreatedBy">dot_Termservice</field> 
     <field id="CreatedOn">20020626T120555Z</field> 
     <field id="CreatedOnUTC">20020626T100555Z</field> 
     <field id="CreatedOrUpdatedBy">dot_Termservice</field> 
     <field id="CreatedOrUpdatedOn">20020626T120555Z</field> 
     <field id="CreatedOrUpdatedOnUTC">20020626T100555Z</field> 
     <field id="Status">Vorzugsterm.Kunden-orientiert;Vorzugsterm.Technik-orientiert</field> 
     <field id="Term">Persenning</field> 
     <field id="TermType">MainTerm</field> 
     <field id="UserId">18088</field> 
    </Term> 
    <Term id="20"> 
     <field id="CreatedBy">dot_Termservice</field> 
     <field id="CreatedOn">20011105T140407Z</field> 
     <field id="CreatedOnUTC">20011105T120407Z</field> 
     <field id="CreatedOrUpdatedBy">dot_Termservice</field> 
     <field id="CreatedOrUpdatedOn">20080107T141350Z</field> 
     <field id="CreatedOrUpdatedOnUTC">20080107T121350Z</field> 
     <field id="Status">Negativterm.Kunden-orientiert;Negativterm.Technik-orientiert</field> 
     <field id="Term">Verdeckabdeckung</field> 
     <field id="TermType">MainTerm</field> 
     <field id="UpdatedBy">dot_Termservice</field> 
     <field id="UpdatedOn">20080107T141350Z</field> 
     <field id="UpdatedOnUTC">20080107T121350Z</field> 
     <field id="UserId">32287</field> 
    </Term> 
</LangSet> 
<LangSet id="1031"> 
    <field id="Language">1031</field> 
    <field id="PrimaryLanguage">7</field> 
    <Term id="8"> 
     <field id="CreatedBy">dot_Termservice</field> 
     <field id="CreatedOn">20060905T170414Z</field> 
     <field id="CreatedOnUTC">20060905T150414Z</field> 
     <field id="CreatedOrUpdatedBy">dot_Termservice</field> 
     <field id="CreatedOrUpdatedOn">20070711T153241Z</field> 
     <field id="CreatedOrUpdatedOnUTC">20070711T133241Z</field> 
     <field id="Status">Vorzugsterm.Kunden-orientiert;Vorzugsterm.Technik-orientiert</field> 
     <field id="Term">Innenrad</field> 
     <field id="TermType">MainTerm</field> 
     <field id="UpdatedBy">dot_Termservice</field> 
     <field id="UpdatedOn">20070711T153241Z</field> 
     <field id="UpdatedOnUTC">20070711T133241Z</field> 
     <field id="UserId">11818</field> 
    </Term> 
</LangSet> 
</document> 

Tout ce que je veux faire est d'obtenir tous les Textvalues ​​des éléments de champ avec l'id attribut = terme et les retourner dans un Langset comme montrées ci-dessous:

<LangSet> <field id="Term">Innenpersenning</field> <field 
    id="Term">Persenning</field> <field id="Term">Verdeckabdeckung</field> 
    </LangSet> 

    <LangSet> 
<field id="Term">Innenrad</field> 
</LangSet> 

    <LangSet> 
<field id="Term">Raumakustik</field> 
</LangSet> 

    <LangSet> 
<field id="Term">Fahrgastraumbeleuchtung</field> <field 
    id="Term">IB</field> <field id="Term">Innenbeleuchtung</field> <field 
    id="Term">Innenraumbeleuchtung</field> 
</LangSet> 

Je reçois les bonnes valeurs, mais unfortunatley pas dans un nœud Langset:

xquery version "1.0"; 

declare boundary-space strip; 

declare namespace xs="http://www.w3.org/2001/XMLSchema"; 
for $x in doc("Sample.xml")/Document/Database/Dictionary/Concept/LangSet/Term//field 
where $x/@id="Term" 

return $x 

I Je suis sûr que ce n'est pas si difficile mais je suis coincé dans la documentation et je ne peux pas trouver la solution qui fonctionne pour moi.

Merci pour vos suggestions!

+0

Il n'y a pas 'Base de données/Dictionnaire/éléments CONCEPT' dans votre entrée, et 'Document' est un sort avec un" d "minuscule. 'doc (" Sample.xml ")/document/LangSet/Term/field' devrait fonctionner. – potame

Répondre

0

Si vous décidez de renvoyer les éléments <LangSet> de votre document, qui contiennent les éléments descendants <field> appropriés, ils contiendront également tous leurs autres descendants.

Si je comprends ce que vous voulez, vous devez créer à la volée des éléments semi-clones reflétant partiellement votre document d'entrée filtré et les renvoyer.

Analyser LangSet -s et tester chacun d'entre eux pour les descendants souhaités. Si trouvé, créer des éléments de sortie appropriés:

let $doc := doc("Sample.xml") 
for $langset in $doc/document/LangSet 
let $fields := $langset/descendant::field[@id = 'Term'] 
where exists($fields) 
return 
    <LangSet> 
    { 
     for $field in $fields return 
      <field id='Term'>{string($field)}</field> 
    } 
    </LangSet> 
+0

merci beaucoup! C'est exactement ce dont j'avais besoin! Bien bien! – user1788114

+0

@ user1788114 Veuillez consulter [_Que dois-je faire lorsque quelqu'un répond à ma question? _] (Https://stackoverflow.com/help/someone-answers) dans notre [Centre d'aide] (https://stackoverflow.com/help) . – CiaPan

0

Vous pouvez résoudre ce avec une approche descendante comme CiaPan's answer est ou une approche ascendante. Sur la base de l'exemple xml vous a donné des solutions pourraient être:

Top-down

let $document := doc("langset.xml")/* 
for $langset in $document/LangSet 
let $fields := $langset//field[@id = 'Term'] 
return 
    <LangSet> 
    { $fields } 
    </LangSet> 

Bottom-up

let $document := doc("langset.xml")/* 
for $field in $document//field[@id = 'Term'] 
group by $langset := $field/ancestor::LangSet 
order by $langset descending 
return 
    <LangSet> 
    { $field } 
    </LangSet>