XSLT: Wie bekomme index der position bestimmter nodes in alle childs kombiniert

Betrachten Sie das folgende XML:

<root>
    <a>
        <pos>
            <c val="abc"></c>
            <c val="def"></c>
            <c val="ghi"></c>
            <c val="jkl"></c>
            <c val="mno"></c>
        </pos>
        <b>
            <c></c>
        </b>
        <b>
            <c></c>
            <d>here</d>
        </b>
        <b>
            <e>and</e>
            <c></c>
            <d>for</d>
        </b>
        <b>
            <c></c>
            <c></c>
            <d>also</d>
        </b>
    </a>
    <a>
        <pos>
            <c val="pqr"></c>
            <c val="stu"></c>
            <c val="vwx"></c>
            <c val="yz"></c>
        </pos>
        <b>
            <c></c>
            <d>what</d>
        </b>
        <b>
            <c></c>
        </b>
        <b>
            <d>how</d>
        </b>
        <b>
            <c></c>
            <d>where</d>
            <c></c>
        </b>
    </a>
</root>

Nun in meine Ausgabe, wenn ich auch eine <c></c> innerhalb einer b ich benötigen, um den entsprechenden Wert des val Attribut eines <c></c> von der <pos></pos> Knoten. Vom entsprechenden Wert, den ich meine, der index der Knoten c innen pos sollte der gleiche sein wie der index der c in allen b Knoten kombiniert.

Die gewünschte Ausgabe:

<start>
    <level>
        abc
    </level>
    <level>
        def
        here
    </level>
    <level>
        and
        ghi
        for
    </level>
    <level>
        jkl
        mno
        also
    </level>
<start>


<start>
    <level>
        pqr
        what
    </level>
    <level>
        stu
    </level>
    <level>
        how
    </level>
    <level>
        vwx
        where
        yz
    </level>
 </start>

Versuchte ich es mit der folgenden XSL:

<xsl:template match="root">
    <star>
        <xsl:apply-templates select="a"/>
    </start>
</xsl:template>
<xsl:template match="a">
    <xsl:apply-templates select="b"/>
</xsl:template>
<xsl:template match="b">
    <level>
      <xsl:for-each select="*">
          <xsl:choose>
            <xsl:when test="name() = 'd'">
                <xsl:value-of select="."/>
            </xsl:when>
            <xsl:when test="name() = 'e'">
                <xsl:value-of select="."/>
            </xsl:when>
            <xsl:when test="name() = 'c'">
                <xsl:variable name="posCount">
                    <!-- I don't know what to do here -->
                </xsl:valiable>
                <xsl:for-each select="ancestor::a[1]/pos">
                    <xsl:for-each select="c[position() = $posCount]">
                          <xsl:value-of select="@val"/>
                    </xsl:for-each>
                </xsl:for-each>

            </xsl:when>
          </xsl:choose>
      </xsl:for-each>
    </level>
</xsl:template>

Was ich tun muss, ist irgendwie die position, die Anzahl der einzelnen c im inneren alle bs kombiniert und dann den Wert von val Attribut entsprechend positioniert c von innen pos.

Wie kann ich Vorgehen, um es zu tun?

Hinweis: ich bin mit XSLT 1.0

Thnx im vorraus!!!!!

InformationsquelleAutor Surender Thakran | 2014-03-01

Schreibe einen Kommentar