Subject: RE: [xsl] recursive sorting by element name -> Xalan Issue From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Thu, 29 Nov 2007 18:40:21 -0000 |
> 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? Yes. boolean(self::x) is true if the node is an x, false otherwise, Unary minus converts that to a number and negates the number: so true becomes -1, false becomes 0. You are then sorting that as a string, "-1" versus "0", and the ordering these two strings depends on whether hyphens are considered significant by the collating sequence in use. Xalan by default uses a collating sequence in which hyphen is considered insignificant. Change the sort to use data-type="number" and all should be well. Michael Kay http://www.saxonica.com/ > > <?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] recursive sorting by elem, Davis Ford | Thread | Re: [xsl] recursive sorting by elem, Davis Ford |
Re: [xsl] recursive sorting by elem, Davis Ford | Date | Re: [xsl] recursive sorting by elem, Davis Ford |
Month |