xmlxsltxslt-2.0xsl-stylesheet

xslt2.0 Sorting with apply templates not working


i have seen several examples here on how to sort (re-order) a part of an xml with xslt 2.0 However i can't seem to get it working.

Example input file:

<example>
<field1>1</field1>
<field2>2</field2>
<fileheader>
    <headerfield1>1</headerfield1>
    <headerfield2>2</headerfield2>
    <headerfield3>3</headerfield3>
    <consol>
        <consolfield1>1</consolfield1>
        <consolfield2>2</consolfield2>
        <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
                <code>code</code>
                <value>50</value>
            </bespokehook>
        </file>
    </consol>
    <consol>
        <consolfield1>1</consolfield1>
        <consolfield2>2</consolfield2>
        <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
                <code>code</code>
                <value>20</value>
            </bespokehook>
        </file>
    </consol>
    <consol>
        <consolfield1>1</consolfield1>
        <consolfield2>2</consolfield2>
        <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
                <code>code</code>
                <value>40</value>
            </bespokehook>
        </file>
    </consol>
</fileheader>

what i want is to re-order the complete consol segment based on the value in the

                <bespokehook>
                <code>code</code>
                <value>20</value>
            </bespokehook>

I cant seem to get that working. I used several examples from this site and others but no succes.

Can someone tell me how to achieve this

Tnx


Solution

  • The stylesheet

    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs">
    
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="fileheader">
      <xsl:copy>
        <xsl:apply-templates select="* except consol"/>
        <xsl:apply-templates select="consol">
          <xsl:sort select="xs:decimal(file/bespokehook/value)"/>
        </xsl:apply-templates>
      </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    transforms the input

    <example>
    <field1>1</field1>
    <field2>2</field2>
    <fileheader>
        <headerfield1>1</headerfield1>
        <headerfield2>2</headerfield2>
        <headerfield3>3</headerfield3>
        <consol>
            <consolfield1>1</consolfield1>
            <consolfield2>2</consolfield2>
            <file>
                <filefield1>1</filefield1>
                <filefield2>2</filefield2>
                <filefield3>3</filefield3>
                <filefield4>4</filefield4>
                <bespokehook>
                    <code>code</code>
                    <value>50</value>
                </bespokehook>
            </file>
        </consol>
        <consol>
            <consolfield1>1</consolfield1>
            <consolfield2>2</consolfield2>
            <file>
                <filefield1>1</filefield1>
                <filefield2>2</filefield2>
                <filefield3>3</filefield3>
                <filefield4>4</filefield4>
                <bespokehook>
                    <code>code</code>
                    <value>20</value>
                </bespokehook>
            </file>
        </consol>
        <consol>
            <consolfield1>1</consolfield1>
            <consolfield2>2</consolfield2>
            <file>
                <filefield1>1</filefield1>
                <filefield2>2</filefield2>
                <filefield3>3</filefield3>
                <filefield4>4</filefield4>
                <bespokehook>
                    <code>code</code>
                    <value>40</value>
                </bespokehook>
            </file>
        </consol>
    </fileheader>
    </example>
    

    into the result

    <example>
       <field1>1</field1>
       <field2>2</field2>
       <fileheader>
          <headerfield1>1</headerfield1>
          <headerfield2>2</headerfield2>
          <headerfield3>3</headerfield3>
          <consol>
             <consolfield1>1</consolfield1>
             <consolfield2>2</consolfield2>
             <file>
                <filefield1>1</filefield1>
                <filefield2>2</filefield2>
                <filefield3>3</filefield3>
                <filefield4>4</filefield4>
                <bespokehook>
                   <code>code</code>
                   <value>20</value>
                </bespokehook>
             </file>
          </consol>
          <consol>
             <consolfield1>1</consolfield1>
             <consolfield2>2</consolfield2>
             <file>
                <filefield1>1</filefield1>
                <filefield2>2</filefield2>
                <filefield3>3</filefield3>
                <filefield4>4</filefield4>
                <bespokehook>
                   <code>code</code>
                   <value>40</value>
                </bespokehook>
             </file>
          </consol>
          <consol>
             <consolfield1>1</consolfield1>
             <consolfield2>2</consolfield2>
             <file>
                <filefield1>1</filefield1>
                <filefield2>2</filefield2>
                <filefield3>3</filefield3>
                <filefield4>4</filefield4>
                <bespokehook>
                   <code>code</code>
                   <value>50</value>
                </bespokehook>
             </file>
          </consol>
       </fileheader>
    </example>