2017-10-17 2 views
0

Ich habe ein Problem beim Abfragen einer XML-Struktur.Abfrage aller Knoten mit einem speziellen Attributwert

Dies ist das Dokument:

<?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> 

Alles, was ich tun möchte, ist mit dem id = Term-Attribut alle Textvalues ​​der Feldelemente zu erhalten und sie in einem Langset zurück, wie unter showned:

<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> 

ich die richtigen Werte bekommen, aber leider ist nicht in einem Langset Knoten:

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 Ich bin mir sicher, dass es nicht so schwierig ist, aber ich stecke in der Dokumentation fest und ich kann nicht die Lösung finden, die für mich funktioniert.

Vielen Dank für Anregungen!

+0

Es gibt keine 'Datenbank/Dictionary/Concept' Elemente in Ihrer Eingabe und 'Dokument' ist buchstabiert mit einem Kleinbuchstaben" d ". 'doc (" Sample.xml ")/document/LangSet/Term/field" sollte funktionieren. – potame

Antwort

0

Wenn Sie sich dazu entschließen, <LangSet> Elemente aus Ihrem Dokument zurückzugeben, die entsprechende <field> Nachkommenelemente enthalten, enthalten sie auch alle anderen Nachkommen.

Wenn ich verstehe, was Sie wollen, müssen Sie einige Semi-Clone-Elemente erstellen, die teilweise Ihr gefiltertes Eingabedokument reflektieren und zurückgeben.

Scannen Sie LangSet -s und testen Sie jeden von ihnen für gewünschte Nachkommen. Wenn gefunden, geeignete Ausgangselemente erstellen:

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

vielen dank! Das ist genau das, was ich brauchte! Großartig! Großartig! – user1788114

+0

@ user1788114 Bitte lesen Sie [_Was soll ich tun, wenn jemand meine Frage beantwortet? _] (Https://stackoverflow.com/help/someone-answers) in unserer [Hilfe] (https://stackoverflow.com/help) . – CiaPan

0

du wie CiaPan's answer mit einem Top-down-Ansatz lösen kann, ist oder eine Bottom-up-Ansatz. Basierend auf dem XML-Beispiel haben Sie Lösungen sein könnten:

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> 
Verwandte Themen