1
votes

I have this example XML file:

<?xml version="1.0" encoding="UTF-8" ?>

<Diplomanden>
    <student matrikelNr="91426" nachname="Q1" vorname="M1"/>
    <student matrikelNr="91427" nachname="Q2" vorname="M2"/>
    <student matrikelNr="91428" nachname="Q3" vorname="M3"/>
    <student matrikelNr="91429" nachname="Q4" vorname="M4"/>
    <student matrikelNr="91430" nachname="Q5" vorname="M5"/>

    <mitarbeiter persNr="111111" nachname="N1" vorname="V1"/>
    <mitarbeiter persNr="111112" nachname="N2" vorname="V2"/>
    <mitarbeiter persNr="111113" nachname="N3" vorname="V3"/>
    <mitarbeiter persNr="111114" nachname="N4" vorname="V4"/>

    <schreibt_DA_bei studentRef="91426" persRef="111111"/>
    <schreibt_DA_bei studentRef="91426" persRef="111112"/>
    <schreibt_DA_bei studentRef="91427" persRef="111111"/>
    <schreibt_DA_bei studentRef="91429" persRef="111113"/>
    <schreibt_DA_bei studentRef="91429" persRef="111113"/>
    <schreibt_DA_bei studentRef="91429" persRef="111112"/>
</Diplomanden>

and a transform file:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="schreibt_DA_bei">
        <xsl:variable name = "sR" select="@studentRef"/>

        <xsl:variable name = "s" select="//student[@matrikelNr = $sR]"/>

        <!-- OUTPUT -->
Student <xsl:value-of select="normalize-space($s/@nachname)"/> schreibt Diplomarbeit
    </xsl:template>

    <xsl:template match="text()|@*"/>
</xsl:transform>

For

<xsl:variable name = "s" select="//student[@matrikelNr = $sR]"/>

Why does the parameter select for variable s work? // means "descendant-or-self" and my actual node is schreibt_DA_bei. In my opinion is "preceding-sibling::student" right (it also works), but why "descendant-or-self" finds the right student?

If I execute an XPath expression like: /child::Diplomanden/child::schreibt_DA_bei/descendant-or-self::student no student is selected.

1

1 Answers

2
votes

The select attribute in xsl:variable works relative to the current node but only if given a relative XPath expression. If given an absolute XPath expression, the current node is irrelevant.

//student[@matrikelNr = $sR]"/> works regardless of the current node because it is an absolute, not a relative XPath.

If it were .//student[@matrikelNr = $sR]"/> (note the leading .), then the context would matter and you would be right that it wouldn't select any student elements when the current node is one of the schreibt_DA_bei elements.