2 Stimmen

Zugriff auf das Kind eines anderen Knotens vom Kind eines Knotens in XSLT

Wie kann man auf den untergeordneten Knoten des übergeordneten Knotens 1 vom untergeordneten Knoten des übergeordneten Knotens 2 in XSLT zugreifen?

<Test>
    <SOLUTIONS>
        <SOLUTION>
            <OBSERVATIONS>
                <OBSERVATION Key = "1ASED">A1</OBSERVATION>
                <OBSERVATION Key = "2DFED">A2</OBSERVATION>
                <OBSERVATION Key = "3DGEE">A3</OBSERVATION>
            </OBSERVATIONS>
            <ITRs>
                <ITR Key = "ASE1">P1</ITR>
                <ITR Key = "GGEE1">P2</ITR>
                <ITR Key = "GERFECE1">P3</ITR>
            </ITRs>
        </SOLUTION>
        <SOLUTION>
            <OBSERVATIONS>
                <OBSERVATION Key = "ABCD">A1</OBSERVATION>
                <OBSERVATION Key = "EFGH">A2</OBSERVATION>
                <OBSERVATION Key = "IJKL">A3</OBSERVATION>
            </OBSERVATIONS>
            ...
        </SOLUTION>
    </SOLUTIONS>
</Test>

Für jeden ITR muss die Beobachtung gedruckt werden. Für den ersten ITR muss ich den Schlüssel dieses Datensatzes mit dem Schlüssel der Beobachtung verknüpfen. Es sollen also insgesamt 9 Datensätze angezeigt werden.

Mein XSLT lautet

<xsl:for-each select="/Test/SOLUTIONS/SOLUTION">
    <xsl:for-each select="ITRs/ITR">
      <xsl:variable name="Key_ITRPS" select="@Key"/>
      <xsl:for-each select="/Test/SOLUTIONS/SOLUTION/OBSERVATIONS/OBSERVATION">
            <xsl:variable name="srcKey_A" select="@Key"/>
            <xsl:element name="Relationship">
                <xsl:attribute name="RelCommonKey">
                    <xsl:value-of select="concat($Key_ITRPS,$srcKey_A)"/>
                </xsl:attribute>
            </xsl:element>
      </xsl:for-each>
    </xsl:for-each>
</xsl:for-each>

Die gewünschte Ausgabe lautet

 RelCommonKey

 ASE11ASED
 ASE12DFED
 ASE13DGEE

 GGEE11ASED
 GGEE12DFED
 GGEE13DGEE

 GERFECE11ASED
 GERFECE12DFED
 GERFECE13DGEE

Das Problem, dem ich hier gegenüberstehe, ist, dass ich neben den oben genannten Daten auch den Beobachtungsschlüssel in der zweiten Zeile bemerke.

der ITR-Schlüssel "ASE1" ist auch mit "ABCD, "EFGH", "IJKL" verknüpft. Bitte helfen Sie mir, die Daten wie oben angezeigt einzuschränken.

2voto

ColinE Punkte 66577

Ihr Problem ist, dass Ihre XPath-Abfragen alle auf dem Root-Knoten "/Test" verankert sind. Sie müssen stattdessen den aktuellen Kontext und die "übergeordnete" XPath-Achse verwenden, um vom ITR-Element zu den OBSERVATIONS innerhalb derselben SOLUTION zu navigieren. Die folgende XSLT-Datei liefert die gewünschte Ausgabe:

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

  <xsl:template match="/">
    <xsl:apply-templates select="//SOLUTION"/>
  </xsl:template>

  <xsl:template match="SOLUTION">
    <!-- iterat over the ITRs for this solution -->
    <xsl:for-each select="ITRs/ITR">
      <xsl:variable name="Key_ITRPS" select="@Key"/>
      <!-- iterate over the observations -->
      <xsl:for-each select="../../OBSERVATIONS/OBSERVATION">
        <!-- the ITR Key -->
        <xsl:value-of select="$Key_ITRPS"/>
        <!-- the related observation -->
        <xsl:value-of select="@Key"/>
        <!-- a newline -->
        <xsl:text>
        </xsl:text>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X