xsl-list
[Top] [All Lists]

[xsl] copying complete document, but sort specific childnodes

2009-09-04 08:24:03
hello,

i try to copy an xml document and want to sort specific childnodes of
that document, the rest of the document structure should stay the
same. i nearly got it working, but nested group tags loose their
position after the transform process.

i attached my source document, xsl and the expected and real result. i
would be great it somebody knows how to do this. (i hope i didn't post
too much code, i just want to make my problem clear)

thanks,
marc

--

my source document:

<document>
        <group id="group_abc123">
                <item id="123456" sort-order="2">
                        <childitem id="bar">foo</childitem>
                        <childitem id="text">1</childitem>
                </item>
                <item id="123456" sort-order="1">
                        <childitem id="bar">foo</childitem>
                        <childitem id="text">1</childitem>
                </item> 
                <item id="123456" sort-order="3">
                        <childitem id="bar">foo</childitem>
                        <childitem id="text">1</childitem>
                </item>
                <group id="group_def123">
                        <item id="123456" sort-order="2">
                                <childitem id="bar">foo</childitem>
                                <childitem id="text">1</childitem>
                        </item>
                        <item id="123456" sort-order="1">
                                <childitem id="bar">foo</childitem>
                                <childitem id="text">1</childitem>
                        </item> 
                        <item id="123456" sort-order="3">
                                <childitem id="bar">foo</childitem>
                                <childitem id="text">1</childitem>
                        </item>
                        <item id="123456" sort-order="4">
                                <childitem id="bar">foo</childitem>
                                <childitem id="text">1</childitem>
                        </item>
                </group>        
                <item id="123456" sort-order="4">
                        <childitem id="bar">foo</childitem>
                        <childitem id="text">1</childitem>
                </item>
        </group>
        <group id="group_abc456">
                <item id="123456" sort-order="2">
                        <childitem id="bar">foo</childitem>
                        <childitem id="text">1</childitem>
                </item>
                <item id="123456" sort-order="1">
                        <childitem id="bar">foo</childitem>
                        <childitem id="text">1</childitem>
                </item> 
                <item id="123456" sort-order="3">
                        <childitem id="bar">foo</childitem>
                        <childitem id="text">1</childitem>
                </item>
                <item id="123456" sort-order="4">
                        <childitem id="bar">foo</childitem>
                        <childitem id="text">1</childitem>
                </item>
        </group>
</document>

--

my xsl:

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

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:php="http://php.net/xsl"; exclude-result-prefixes="php">

<xsl:output method="xml" encoding="UTF-8" indent="yes"
omit-xml-declaration="yes" />

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

<xsl:template match="group">
        <xsl:element name="{name(.)}">
                <xsl:for-each select="@*">
                        <xsl:attribute name="{name(.)}"><xsl:value-of 
select="." /></xsl:attribute>
                </xsl:for-each>
                <xsl:apply-templates>
                        <xsl:sort select="@sort-order" data-type="number"/>
                </xsl:apply-templates>
        </xsl:element>
</xsl:template>

</xsl:stylesheet>

--

expected result:

<?xml version="1.0" encoding="UTF-8"?>
<document>
  <group id="group_abc123">
      <item id="123456" sort-order="1">
        <childitem id="bar">foo</childitem>
        <childitem id="text">1</childitem>
      </item>
      <item id="123456" sort-order="2">
        <childitem id="bar">foo</childitem>
        <childitem id="text">1</childitem>
      </item>
      <item id="123456" sort-order="3">
        <childitem id="bar">foo</childitem>
        <childitem id="text">1</childitem>
      </item>
      <group id="group_def123">
         <item id="123456" sort-order="1">
           <childitem id="bar">foo</childitem>
           <childitem id="text">1</childitem>
         </item>
         <item id="123456" sort-order="2">
           <childitem id="bar">foo</childitem>
           <childitem id="text">1</childitem>
         </item>
         <item id="123456" sort-order="3">
           <childitem id="bar">foo</childitem>
           <childitem id="text">1</childitem>
         </item>
         <item id="123456" sort-order="4">
           <childitem id="bar">foo</childitem>
           <childitem id="text">1</childitem>
         </item>
     </group>
      <item id="123456" sort-order="4">
        <childitem id="bar">foo</childitem>
        <childitem id="text">1</childitem>
      </item>
  </group>
  <group id="group_abc456">
    <item id="123456" sort-order="1">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
    <item id="123456" sort-order="2">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
    <item id="123456" sort-order="3">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
    <item id="123456" sort-order="4">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
  </group>
</document>

--

given result:

<?xml version="1.0" encoding="UTF-8"?>
<document>
  <group id="group_abc123">
    <group id="group_def123">
      <item id="123456" sort-order="1">
        <childitem id="bar">foo</childitem>
        <childitem id="text">1</childitem>
      </item>
      <item id="123456" sort-order="2">
        <childitem id="bar">foo</childitem>
        <childitem id="text">1</childitem>
      </item>
      <item id="123456" sort-order="3">
        <childitem id="bar">foo</childitem>
        <childitem id="text">1</childitem>
      </item>
      <item id="123456" sort-order="4">
        <childitem id="bar">foo</childitem>
        <childitem id="text">1</childitem>
      </item>
    </group>
    <item id="123456" sort-order="1">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
    <item id="123456" sort-order="2">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
    <item id="123456" sort-order="3">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
    <item id="123456" sort-order="4">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
  </group>
  <group id="group_abc456">
    <item id="123456" sort-order="1">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
    <item id="123456" sort-order="2">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
    <item id="123456" sort-order="3">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
    <item id="123456" sort-order="4">
      <childitem id="bar">foo</childitem>
      <childitem id="text">1</childitem>
    </item>
  </group>
</document>

--~------------------------------------------------------------------
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>