[XQuery] Geen child nodes in resultaat

Pagina: 1
Acties:

  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
Ik ben bezig met enkele huiswerkopgaven, waarin ik me onder andere moet verdiepen in XQuery. In één van de opdrachten moet ik een specifieke node opzoeken, en deze als resultaat opleveren. Maar in dit resultaat mogen de childnodes van deze node niet voorkomen.

Nu is het vinden van deze node het probleem niet, maar ik vraag me af of er een simpele manier is om nu alleen de node te selecteren, en niet de child nodes erbij. Om het geheel duidelijk te maken hier even wat code :)

code:
1
2
3
4
<result>{
let $doc := document("/XQuery/docs/xmach-1/d2.xml")
return $doc//section1[@id='s10']
}</result>

geeft als resultaat

code:
1
2
3
4
5
6
<result>
  <section1 id="s10">
    <head1>The the</head1>
    <paragraph>Mac officials program unit key all interest john to been affecting. Irradiation tech questions.</paragraph>
  </section1>
</result>

maar ik zou als resultaat willen hebben

code:
1
2
3
<result>
  <section1 id="s10"/>
</result>

Nu zou ik dus wel gewoon het resultaat zelf op kunnen bouwen, maar voor veel uitgebreidere nodes, met veel attributen zou dat veel werk zijn. Nu is dus mijn vraag of er niet gewoon een snellere manier voor is :)

  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
Niemand?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:15
Even anders formuleren. Je wil een stuk data opleveren dat geen onderdeel is van de oorspronkelijke dataset. Je zult dus hoe dan ook een nieuwe node moeten construeren; simpelweg het resultaat van een XPath-query opleveren gaat nooit werken omdat je daarmee simpelweg alleen al bestaande nodes kunt selecteren.

Naar mijn idee moet je dus de naam en attributen selecteren (dat kan met de atribute::* axis) en op basis daarvan de node reconstrueren, zonder child nodes.

Zoiets dus:
XQuery:
1
2
3
4
5
<result>{
let $doc := document("/XQuery/docs/xmach-1/d2.xml")
for $n in $doc//*[@id='s10']
return element {name($n)} {$n/attribute::*}
}</result>

[ Voor 72% gewijzigd door Soultaker op 17-02-2006 16:04 ]


  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
Ja inderdaad, die uitwerking klopt :)

Ik had zelf de volgende al gevonden:

code:
1
2
3
4
5
6
7
<result>
{
let $doc := document("/XQuery/docs/xmach-1/d2.xml")
for $s in $doc//section1[@id='s10']
return <section1>{$s/@*}</section1>
}
</result>


In principe hetzelfde, alleen die van jou is wat generieker :)

Thx voor je hulp.

  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
Er stond nog een vraag in waar ik wel een oplossing voor heb, maar eigenlijk twijfel of het de goede is. Hierin moet ik alle attributen die voorkomen in het xml bestand hebben, en deze weergeven in een lijst van <att> elementen, die deze gevonden attributen zelf als attribuut hebben. En deze lijst moet ik dan sorteren op de waarde van de attributen.

Nu heb ik hier dus wel de volgende oplossing voor:

code:
1
2
3
4
5
6
7
8
<result>
{
let $doc := document("/XQuery/docs/xmach-1/d2.xml")
for $a in $doc//*[@*]
order by $a/@*/text()
return <att> {$a/@*} </att>
}
</result>


Maar het sorteren op de waarde van de attributen gaat volgens mij niet helemaal goed. Ook worden er als een element 2 attributen had, deze in 1 <att> element gestopt, in plaats van 2...

Iemand hier misschien nog wat betere ideeën voor?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:15
Jawel. Jij probeert nu eerst elementen te selecteren met attributen, maar waarschijnlijk moet je direct de attributen selecteren: $doc//attribute::*. Sorteren en weergeven is dan opeens ook makkelijker.

  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
Ah ok, klinkt logisch wat je zegt :)

Zal het vanavond thuis eens ff proberen, alweer bedankt :)

EDIT:

Ja inderdaad, dat werkt beter. De oplossing is nu geworden:

code:
1
2
3
4
5
6
7
8
<result>
{
let $doc := document("/XQuery/docs/xmach-1/d2.xml")
for $a in $doc//@*
order by $a
return <att> {$a} </att>
}
</result>

[ Voor 54% gewijzigd door ResD op 18-02-2006 15:34 . Reden: Oplossing getest ]

Pagina: 1