Terwijl ik recursief (en zonder de structuur vooraf te weten) door een xml bestand heenloop probeer ik het xpath op te bouwen naar de huidige node, bv /content/link[2]/title. Het probleem waar ik tegenaanloop is dat position() de positie van de huidige child binnen zijn parent geeft - ongeacht de nodename - maar /link[1] kan best /child::*[3] zijn, en position() geeft me dus niet die 1, maar die 3. Stel ik heb de volgende fictieve xml:
terwijl ik door de childs (melp en woei) van <element> heenloop kan ik iig wel checken hoeveel nodes er binnen die parent zijn met dezelfde nodename met een if of when:
($currentName is een xsl:variable met de nodename van de huidige processed node)
Als er dan maar 1 child met die naam is heb ik de positie niet nodig voor de xpath. Wat ik zou kunnen doen als er wel meer dan 1 van is, is bv voor /woei[1] niet de nodename aan het pad toevoegen, maar /*[3], maar dat vind ik te ranzig/foutgevoelig.
Ik heb geprobeerd met een for-each door de alleen de child van de parent heen te lopen die dezelfde nodename hebben, en de position() daarvan op te halen als de huidige node tegengekomen wordt, ala:
Maar dat gaat redelijk fout (het vergelijkt strings, geen objecten), en hoewel ik inmiddels aardig mn weg weet door xsl en xpath houdt het hier een beetje op
Zie ik iets over het hoofd en is hier een veel simpelere oplossing voor? kan het ueberhaupt? help?
code:
1
2
3
4
5
6
| <element> <melp> lorem </melp> <melp> ipsum </melp> <woei> dolor </woei> <woei> sit amet </woei> </element> |
terwijl ik door de childs (melp en woei) van <element> heenloop kan ik iig wel checken hoeveel nodes er binnen die parent zijn met dezelfde nodename met een if of when:
code:
1
| test="count(../*[name()=$currentName])=1" |
($currentName is een xsl:variable met de nodename van de huidige processed node)
Als er dan maar 1 child met die naam is heb ik de positie niet nodig voor de xpath. Wat ik zou kunnen doen als er wel meer dan 1 van is, is bv voor /woei[1] niet de nodename aan het pad toevoegen, maar /*[3], maar dat vind ik te ranzig/foutgevoelig.
Ik heb geprobeerd met een for-each door de alleen de child van de parent heen te lopen die dezelfde nodename hebben, en de position() daarvan op te halen als de huidige node tegengekomen wordt, ala:
code:
1
2
3
4
5
6
| <xsl:variable name="currentNode" select="." />
<xsl:for-each select="../*[name()=$currentName]">
<xsl:if test=". = $currentNode">
<xsl:value-of select="concat('/', name(), '[', position(), ']')" />
</xsl:if>
</xsl:for-each> |
Maar dat gaat redelijk fout (het vergelijkt strings, geen objecten), en hoewel ik inmiddels aardig mn weg weet door xsl en xpath houdt het hier een beetje op
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin