Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[XSL] Een node selecteren dmv index

Pagina: 1
Acties:

  • kmmartins
  • Registratie: Maart 2003
  • Laatst online: 11-03-2024
Met de volgende XPath wil ik één node selecteren

code:
1
($calib/codingSchemeDesignator = 'DCM'])[$index]


Helaas krijg ik nu nog steeds 2 nodes.
als ik [$index] vervang door [1] doet ie het wel (als ik [$index] vervang door ['1'] krijg ik ook 2 nodes)

$index staat zo gedeclareerd:
code:
1
    <xsl:param name="index">2</xsl:param>


Hoe zorg ik ervoor dat ik maar één node selecteer, met de waarde uit $index

Verwijderd

kmmartins schreef op donderdag 21 juni 2007 @ 13:01:
Met de volgende XPath wil ik één node selecteren

[..]

Hoe zorg ik ervoor dat ik maar één node selecteer, met de waarde uit $index
code:
1
$calib/codingSchemeDesignator[. = 'DCM'][number($index)]


Jouw XPath expressie klopte niet, en je index was een String.

[ Voor 36% gewijzigd door Verwijderd op 21-06-2007 23:03 . Reden: XPath verbeterd ]


  • kmmartins
  • Registratie: Maart 2003
  • Laatst online: 11-03-2024
Bedankt! number() had ik nodig.

Ik heb een nieuw probleem
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<NUM>
    <id>1</id>
       <waarde>iets</waarde>
    <code>
        <id>2</id>
    <code/>
    <code>
        <id>BBB</id>
    <code/>
</NUM>
<NUM>
    <id>1</id>
      <waarde> iets</waarde>
    <code>
        <id>2</id>
    <code/>
    <code>
        <id>AAA</id>
    <code/>
</NUM>


Ik wil de waarde uit de 2e num node weten en heb de volgende gegevens:
code id = 2 en
code id = AAA en
num id = 1
Mijn xpath ziet er dan zo uit
code:
1
num[id =1 and code/id = 2 and code/id = AAA ]/waarde


Maar dat werkt dus niet.
als ik
code:
1
code[2]/id = AAA
gebruik werkt het wel, maar de volgorde van de code nodes staan niet vast.

Verwijderd

code:
1
//NUM[id =1 and code/id = 2 and code/id = "AAA" ]/waarde


Puntjes van aandacht:
  • NUM in hoofdletters in je XPath, want elementen zijn case-sensitive. Of gebruik liever <num> in je xml-bestand.
  • cijfers hoeven niet in quotes, maar strings als AAA wel. "AAA" dus.
  • Je xml-bestand is niet welgevormd. Je "sluittags" hebben de vorm <code/> maar moeten </code> zijn

  • kmmartins
  • Registratie: Maart 2003
  • Laatst online: 11-03-2024
een NUM node ziet er eigenlijk zo uit:
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
35
36
37
38
39
40
41
42
                <NUM>
                    <relationshipType> CONTAINS </relationshipType>
                    <conceptNameCodeSequence>
                        <codeValue> G-0366 </codeValue>
                        <codingSchemeDesignator> SRT </codingSchemeDesignator>
                        <codeMeaning> Vessel Lumen Cross-Sectional Area </codeMeaning>
                    </conceptNameCodeSequence>
                    <measuredValueSequence>
                        <measurementUnitsCodeSequence>
                            <codeValue> mm2 </codeValue>
                            <codingSchemeDesignator> UCUM </codingSchemeDesignator>
                            <codeMeaning> mm^2 </codeMeaning>
                        </measurementUnitsCodeSequence>
                        <numericValue> 234{minimim circular area} </numericValue>
                    </measuredValueSequence>
                    <CODE>
                        <relationshipType> HAS CONCEPT MOD </relationshipType>
                        <conceptNameCodeSequence>
                            <codeValue> G-C036 </codeValue>
                            <codingSchemeDesignator> SRT </codingSchemeDesignator>
                            <codeMeaning> Measurement Method </codeMeaning>
                        </conceptNameCodeSequence>
                        <conceptCodeSequence>
                            <codeValue> 122473 </codeValue>
                            <codingSchemeDesignator> DCM </codingSchemeDesignator>
                            <codeMeaning> Circular Method </codeMeaning>
                        </conceptCodeSequence>
                    </CODE>
                    <CODE>
                        <relationshipType> HAS CONCEPT MOD </relationshipType>
                        <conceptNameCodeSequence>
                            <codeValue> 121401 </codeValue>
                            <codingSchemeDesignator> DCM </codingSchemeDesignator>
                            <codeMeaning> Derivation </codeMeaning>
                        </conceptNameCodeSequence>
                        <conceptCodeSequence>
                            <codeValue> R-404FB </codeValue>
                            <codingSchemeDesignator> SRT </codingSchemeDesignator>
                            <codeMeaning> Minimum </codeMeaning>
                        </conceptCodeSequence>
                    </CODE>
                </NUM>


Maar ik heb het probleem even versimpeld.

en mijn xpath ziet er zo uit:
code:
1
/structuredXMLDocument/contentTree/CONTAINER/CONTAINER[2]/NUM/conceptNameCodeSequence[ normalize-space(codingSchemeDesignator) = 'SRT'  and normalize-space(codeValue) = 'G-0366'  and  normalize-space(../CODE/conceptCodeSequence/codeValue) = '122473' and normalize-space(../CODE/conceptCodeSequence/codeValue) = 'R-404FB' ]/../measuredValueSequence/numericValue


Ik kan de xml code niet veranderen. Die krijg ik zo aangeleverd. codeValue is dus het "id"

Verwijderd

je normalize-space functie krijgt 2 codeValue argumenten mee.

dat gaat fout, want hij mag maar 1 argument (1 string om whitespace te clearen)

als je jouw xpath runt wordt normalize-space aangeroepen met: "122437","R-404FB") omdat:

../CODE/conceptCodeSequence/codeValue

2 nodes selecteert, en niet 1

  • kmmartins
  • Registratie: Maart 2003
  • Laatst online: 11-03-2024
Inderdaad, maar nu moet ik nog een oplossing hiervoor vinden, maar dat is me niet gelukt.

Kun je me in een goede richting duwen?

Verwijderd

wat wil je precies bereiken? in woorden?

  • kmmartins
  • Registratie: Maart 2003
  • Laatst online: 11-03-2024
In het bovenstaande xml stukje zou ik de waarde "234{minimim circular area}" willen weg schrijven.
Dat is dus de NUM/measuredValueSequence/numericValue

En ik weet alle codeValue waardes.
De conceptNameCodeSequence/codeValue atribuut kun je zien als een soort id. (eigenlijk in combinatie met de codingSchemeDesignator)
In dit voorbeeld zou num/conceptNameCodeSequence/codeValue al uniek zijn, maar dat is het dus niet. Er zijn meer NUM nodes met de zelfde conceptNameCodeSequence/codeValue. Maar de CODE nodes verschillen dus.

(CODE geeft aan of het een minimum of maximum waarde betreft en de andere CODE geeft de methode aan)

Verwijderd

weet je de volgorde van de CODE elementen?

m.a.w. weet je wanneer je checkt voor een waarde in het eerste, en wanneer in het tweede code element?

code:
1
2
3
4
5
//NUM[normalize-space(conceptNameCodeSequence/codingSchemeDesignator) 
= 'SRT' and normalize-space(conceptNameCodeSequence/codeValue) = 'G-0366' and
 normalize-space(CODE[1]/conceptCodeSequence/codeValue) = '122473' and 
normalize-space(CODE[2]/conceptCodeSequence/codeValue) = 
'R-404FB']/measuredValueSequence/numericValue


Hier gebruik ik expliciet het eerste en tweede CODE element om te testen, maar dat is misschien niet wat je wilt. Het handigste lijkt me gewoon die whitespace uit je source document.. dan heb je normalize-space niet nodig en kun je testen over meerdere nodes.. maarja :P

Verwijderd

Ik wil dit topic even kicken, omdat het best een boeiend probleem is en er vast meer mensen tegenaan gaan lopen.

De essentie is dat wanneer de waardes in de elementen van een boom beginnen en eindigen met whitespace, je niet zomaar kunt selecteren met '=' omdat daarvoor whitespace wel telt.

Maar, wanneer je een functie gebruikt om whitespace te strippen dan mag je maar 1 element invoeren. '=' kan matchen op meerdere elementen (dat is wat hier gebeurt), maar dat kan dus niet incombinatie met een functie als normalize-space die op maar 1 enkele node werkt.

Kortom, wat hier gewenst is is matchen op meerdere nodes waar whitespace er niet toe doet.

Ik hoop dat iemand daar nog wat nuttigs over kan zeggen. Ik houd het er voorlopig op dat het het gemakkelijkst is om de whitespace weg te halen, maar wellicht kan dat niet altijd.
Pagina: 1