Subject: Re: [xsl] recursive sorting by element name -> Xalan Issue From: "Davis Ford" <davisford@xxxxxxxxx> Date: Thu, 29 Nov 2007 13:15:56 -0500 |
Hi Michael, thanks for clearing that up. I am *almost* there now, with the current incarnation of the stylesheet (below). The only remaining issue I have appears to be with Xalan. When I serialize out a collection with JAXB, and apply the stylesheet (using code posted previously), it sorts everything and I have no missing attributes, except the DictionaryModelDescriptor node is now at the bottom of the file instead of the top. When I run with xsltproc on mac/linux it places it at the top. Any idea why I get this behavior? <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt" > <!-- The xalan param gets back indentation that seems to be broken in the java api --> <xsl:output method="xml" indent="yes" encoding="UTF-8" xalan:indent-amount="4"/> <xsl:strip-space elements="*" /> <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:copy-of select="@*"/> <!-- copy all attributes before applying templates to children only --> <xsl:apply-templates select="node()"> <xsl:sort select="- boolean(self::DictionaryModelDescriptor)"/> <xsl:sort select="@typeName"/> <xsl:sort select="name(.)"/> <xsl:sort /> </xsl:apply-templates> </xsl:copy> </xsl:template> </xsl:stylesheet> On Nov 29, 2007 12:46 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote: > > > > > >I am running into some issues / inconsistencies running this > > >transformation on command line vs. within java vs. which > > platform I run > > >it on. I'm hoping the list might have some pointers on how > > to resolve his. > > > <xsl:template match="@*|node()"> > > <xsl:copy> > > <xsl:apply-templates select="@*|node()"> > > <xsl:sort select="@typeName"/> > > <xsl:sort select="name(.)"/> > > <xsl:sort /> > > </xsl:apply-templates> > > </xsl:copy> > > </xsl:template> > > This code may have the effect of sorting child elements before attributes > (specifically a child element with no typeName attribute whose name > alphabetically precedes the attribute names). You aren't allowed to create > attributes for an element after creating child elements. In XSLT 1.0 the > processor has the option of ignoring the error by discarding the offending > attributes. > > > >When I run this on Ubuntu Linux 7.10 (fully updated) using > > xsltproc, I > > >encounter this bug: > > > > > >https://bugs.launchpad.net/ubuntu/+source/libxml2/+bug/147144 > > > > > >Namely, it reports the error: > > > > > >runtime error: file SortCollections.xsl line 40 element copy > > Attribute > > >nodes must be added before any child nodes to an element. > > That doesn't look like a bug to me, it looks like correct behaviour. > > > > > > >When I run this on Mac OS X 1.5 (Leopard -- fully updated) using > > >xsltproc, it does exactly what I want with no problems. > > That looks like a bug to me. > > > > > > >When I run this script from Java 1.6 (using JAXB) with the > > code below, > > >the identity transform does not copy all the attributes over. > > >I end up with missing attributes, and I have no idea why. > > Xalan is apparently choosing the option to ignore the error and discard the > attributes. > > Michael Kay > http://www.saxonica.com/ > > -- Zeno Consulting, Inc. http://www.zenoconsulting.biz 248.894.4922 phone 313.884.2977 fax
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] sorting (again), Michael Kay | Thread | RE: [xsl] recursive sorting by elem, Michael Kay |
Re: [xsl] How to read Schema XSD in, Eliot Kimber | Date | RE: [xsl] recursive sorting by elem, Michael Kay |
Month |