xsl-list
[Top] [All Lists]

Re: [xsl] Path according to a child node attribute

2012-01-02 03:59:01
Hi all,

I have posted a similar question two days ago see
http://www.biglist.com/lists/lists.mulberrytech.com/xsl-list/archives/201112
/msg00325.html in order to create a Path according to a child node attribute
Only, there is a slightly change which adds other Rubric elements with more
kind attributes and inside them, two Label elements for the language chosen:

<?xml version="1.0" encoding="UTF-8"?>
<root>
        <Class code="B">
                <SubClass code="b1"/>
                <SubClass code="b2"/>
                <Rubric kind="preferred">
                        <Label xml:lang="it">FUNZIONI CORPOREE</Label>
                        <Label xml:lang="en">BODY FUNCTIONS</Label>
                </Rubric>
                <Rubric kind="definition">
                        <Label xml:lang="it">Le funzioni corporee sono
..</Label>
                        <Label xml:lang="en">Body functions ...</Label>
                </Rubric>
        </Class>
        <Class code="b1">
                <SuperClass code="B"/>
                <SubClass code="b110-b139"/>
                <Rubric kind="preferred">
                        <Label xml:lang="it">FUNZIONI MENTALI</Label>
                        <Label xml:lang="en">MENTAL FUNCTIONS</Label>
                </Rubric>
                <Rubric kind="note">
                        <Label xml:lang="it">Questo capitolo ...</Label>
                        <Label xml:lang="en">This chapter ...</Label>
                </Rubric>
        </Class>
        <Class code="b110-b139">
                <SuperClass code="b1"/>
                <SubClass code="b110"/>
                <Rubric kind="preferred">
                        <Label xml:lang="it">FUNZIONI MENTALI
GLOBALI</Label>
                        <Label xml:lang="en">GLOBAL MENTAL FUNCTIONS</Label>
                </Rubric>
        </Class>
        <Class code="b110">
                <SuperClass code="b110-b139"/>
                <Rubric kind="preferred">
                        <Label xml:lang="it">Funzioni della
coscienza</Label>
                        <Label xml:lang="en">Consciousness functions</Label>
                </Rubric>
                <Rubric kind="note">
                        <Label xml:lang="it">Funzioni ...</Label>
                        <Label xml:lang="en">General ...</Label>
                </Rubric>
        </Class>
        <Class code="b2">
                <SuperClass code="B"/>
                <SubClass code="b210-b229"/>
                <Rubric kind="preferred">
                        <Label xml:lang="it">FUNZIONI SENSORIALI E
DOLORE</Label>
                        <Label xml:lang="en">SENSORY FUNCTIONS AND
PAIN</Label>
                </Rubric>
                <Rubric kind="note">
                        <Label xml:lang="it">Questo capitolo ...</Label>
                        <Label xml:lang="en">This chapter ...</Label>
                </Rubric>
        </Class>
        <Class code="b210-b229">
                <SuperClass code="b2"/>
                <SubClass code="b210"/>
                <Rubric kind="preferred">
                        <Label xml:lang="it">FUNZIONI VISIVE E
CORRELATE</Label>
                        <Label xml:lang="en">SEEING AND RELATED
FUNCTIONS</Label>
                </Rubric>
        </Class>
        <Class code="b210">
                <SuperClass code="b210-b229"/>
                <Rubric kind="preferred">
                        <Label xml:lang="it">Funzioni della vista</Label>
                        <Label xml:lang="en">Seeing functions</Label>
                </Rubric>
                <Rubric kind="note">
                        <Label xml:lang="it">Funzioni ...</Label>
                        <Label xml:lang="en">Sensory ...</Label>
                </Rubric>
        </Class>
</root>

The output should be similar like this:

<?xml version="1.0" encoding="UTF-8"?>
<root>
        <Class code="B">
                <SubClass code="b1"/>
                <SubClass code="b2"/>
                <Rubric kind="preferred">
                        <Label xml:lang="it">FUNZIONI CORPOREE</Label>
                        <Label xml:lang="en">BODY FUNCTIONS</Label>
                </Rubric>
                <Rubric kind="definition">
                        <Label xml:lang="it">Le funzioni corporee sono
..</Label>
                        <Label xml:lang="en">Body functions ...</Label>
                </Rubric>
        <Path/>
        </Class>
        <Class code="b1">
                <SuperClass code="B"/>
                <SubClass code="b110-b139"/>
                <Rubric kind="preferred">
                        <Label xml:lang="it">FUNZIONI MENTALI</Label>
                        <Label xml:lang="en">MENTAL FUNCTIONS</Label>
                </Rubric>
                <Rubric kind="note">
                        <Label xml:lang="it">Questo capitolo ...</Label>
                        <Label xml:lang="en">This chapter ...</Label>
                </Rubric>
                <Path>B FUNZIONI CORPOREE</Path>
        </Class>
        <Class code="b110-b139">
                <SuperClass code="b1"/>
                <SubClass code="b110"/>
                <Rubric kind="preferred">
                        <Label xml:lang="it">FUNZIONI MENTALI
GLOBALI</Label>
                        <Label xml:lang="en">GLOBAL MENTAL FUNCTIONS</Label>
                </Rubric>
                <Path>B FUNZIONI CORPOREE/b1 FUNZIONI MENTALI</Path>
        </Class>
        <Class code="b110">
                <SuperClass code="b110-b139"/>
                <Rubric kind="preferred">
                        <Label xml:lang="it">Funzioni della
coscienza</Label>
                        <Label xml:lang="en">Consciousness functions</Label>
                </Rubric>
                <Rubric kind="note">
                        <Label xml:lang="it">Funzioni ...</Label>
                        <Label xml:lang="en">General ...</Label>
                </Rubric>
                <Path>B FUNZIONI CORPOREE/b1 FUNZIONI MENTALI/b110-b139
FUNZIONI MENTALI GLOBALI</Path>
        </Class>
        ...


The aim is the same, now it must be chosen the text inside the <Label
xml:lang="it"> inside <Rubric kind="preferred"> since there are more kind
attributes for <Rubric> element.

Here's the code provided by Martin Hennen which works great if there is only
one <Rubric> element without attribute and inside some text:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="2.0">

  <xsl:key name="k1" match="Class" use="@code"/>

   <xsl:template match="@* | node()">
     <xsl:copy>
       <xsl:apply-templates select="@* | node()"/>
     </xsl:copy>
   </xsl:template>

   <xsl:template match="Class">
     <xsl:copy>
       <xsl:apply-templates select="@* | node()"/>
       <Path>
         <xsl:apply-templates select="key('k1', SuperClass/@code)"
mode="path"/>
       </Path>
     </xsl:copy>
   </xsl:template>

   <xsl:template match="Class" mode="path">
     <xsl:variable name="next" select="key('k1', SuperClass/@code)"/>
     <xsl:if test="$next">
       <xsl:apply-templates select="$next" mode="path"/>
       <xsl:text>/</xsl:text>
     </xsl:if>
     <xsl:value-of select="concat(@code,' ', Rubric)"/>
   </xsl:template>

</xsl:stylesheet>

Many thanks if someone can suggest

GB


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>