Toon posts:

XPath position probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een onderzoek ben ik bezig om alle axes stappen om te schrijven zodat alleen nog gebruik gemaakt wordt van de ancestor, descendant en self axis. Dit om te zorgen dat de queries minder afhankelijk zijn van de boomstructuur en op deze manier betere acces path independence te krijgen.

The parent en child step zijn om te schrijven echter bij de following, following-sibling, preceeding en preceeding-sibling stuit ik op problemen.

Het volgende is het probleem, als we in een node zitten, stel node n, en we willen bijvoorbeeld de preceeding-sibling nodes hebben dan komt het erop neer dat we van de parent van n alle descendant nodes pakken, en de nodes eruit filteren waarvan de parent node niet gelijk is aan de parent van n. Dit is geen probleem, de laatste stap die nodig is om te controleren of we niet de node n en de following-sibling nodes erbij hebben is te controleren of de positie van de descendants nodes kleiner is dan die van node n. Hier treed het probleem op. De positie van de context node is op te vragen maar hoe vraag ik de positie van de node n op? Onderstaande regel maakt het misschien iets duidelijker:

code:
1
2
Let n be the node self selected by p and p be a access path only using descendant, ancestor and self axes
p/ancestor::*[1]/descendant::*[(self::node()/ancestor::*[1] = p/ancestor::*/self::node()) and (position() < p.position())]


In dit geval zou op de plek van p.position() op een of andere manier de positie van de node n moeten komen. De position functie kan niet gebruikt worden aangezien die alleen voor de context node beschikbaar is. Weet iemand een oplossing voor dit probleem of zitten we met dit onderzoek in een dode hoek?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02-05 01:32
Wat is nu het probleem dan? Die position() (zonder iets ervoor) levert je de positie op van de node waar de predicate aan hangt en dat is precies de node die jij 'n' noemt. Dan lijkt me dat de code precies doet wat je wilt?

Verwijderd

Topicstarter
De position levert inderdaad de positie op van de node waar de predicaat aanhangt maar dat is niet node 'n' waar ik de positie van wil hebben. Dat is de node die geselecteerd is vanuit path p. De node waar de predicate aanhangt is de node 'p/ancestor::*[1]/descendant::*'. Mijn vraag is om het in het kort te zeggen hoe kan ik in het predicate van bovenstaande node de position van node 'n' opvragen.

  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 25-02 11:17

Clay

cookie erbij?

* Clay snapt de vraag ook niet helemaal.
heb je misschien hier wat aan?

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


Verwijderd

Topicstarter
Ik heb je post doorgekeken Clay, ga is naar de id kijken of ik daar wat aan heb. Maar om de vraag wat helderder te maken zal ik het wat concreter maken.

Zoals in de beginpost gezegd wil ik alleen nog maar gebruik maken van descendant, ancestor en self axes. Waarom staat er ook wel.

Een voorbeeld XML zou zijn
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<document1>
  <title1>Language prepare</title1>
  <chapter1 id="c1">
    <head1>Marine of federal automatically except</head1>
    <section1 id="s1">
      <head1>Have million is filling</head1>
      <paragraph>Regional session banner. </paragraph>
    </section1>
  </chapter1>
  <chapter1 id="c2">
    <head1>Fat wright</head1>
    <section1 id="s3">
      <head1>To layoffs</head1>
      <paragraph>Action two to modem taxed number is or. </paragraph>
      <paragraph>An los rain finger. </paragraph>
      <paragraph>Plant and stock within made ...</paragraph>
      <paragraph>The spare windows. 
      <paragraph>West removed run. </paragraph>
    </section1>
  </chapter1>
  <chapter1 id="c4">
    <head1>Satisfy west</head1>
    <section1 id="s5">
      <head1>Away compromise that</head1>
      <paragraph>Architecture into hot. </paragraph>
      <paragraph>New lima but as toolbox. </paragraph>
      <paragraph>Press car edi. Itself new how.</paragraph>
    </section1>
    <section1 id="s6">
      <head1>Territories no</head1>
      <paragraph>Than involved submarine. </paragraph>
    </section1>
  </chapter1>
</document>


Stel nu dat we de volgende query hebben:
/descendant::chapter1[1]/descendant::head1[1]/parent::*

We vragen nu op de eerste head1 element en daar de parent van dus we krijgen chapter1 met id c1
We kunnen nu de query ook vervangen zodat de parent stap niet meer voorkomt door de volgende query:
/descendant::chapter1[1]/descendant::head1[1]/ancestor::*[1]

De omschrijf stap in dit geval is:
p/ancestor::*[1]
met p in dit geval /descendant::chapter1[1]/descendant::head1[1]

Voor een child hebben is dit ook gelukt echter nu we bezig zijn met de preceeding-sibling stuiten we op problemen. In theorie zou je de preceeding-sibling nodes op kunnen vragen van een node (noemen we nn) door één stap omhoog te doen in de boom, we komen in de parent node (noemen we pn). Van de parent node vragen we de descendants op en we controleren voor alle descendants of hun parent node gelijk is aan de pn. Daarnaast moeten we nog zorgen dat we alleen de kinderen van de pn pakken die voor nn liggen. Dit laatste is het probleem.

Een oplossing zou zijn om de positie te controleren maar dit is niet mogelijk aangezien position() de plek oplevert van de controlerende node en wil je kijken of deze kleiner is dan de positie van nn dan moet je van nn ook de positie opvragen. Het opvragen van de positie van nn is echter niet mogelijk.

Mijn vraag is dus, is het mogelijk om te controleren of een node voor nn ligt in de kinder set pn.