Subject: Re: [xsl] recursive sorting by element name -> Xalan Issue From: "Davis Ford" <davisford@xxxxxxxxx> Date: Thu, 29 Nov 2007 13:54:33 -0500 |
Thanks for the great exaplanation. So, I tried this... <xsl:sort select="number(name() = 'DictionaryModelDescriptor')" order="descending"/> If I understand you correctly then, if the node is the DictionaryModelDescriptor, the string will now be "1", and all other nodes will be "0". Then I added the order="descending" to reverse the default of ascending...so 1 comes before 0, and all is well! Thanks again for the help! Regards, Davis On Nov 29, 2007 1:40 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote: > > 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 > > -- 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, Michael Kay | Thread | RE: [xsl] recursive sorting by elem, Scott Trenda |
RE: [xsl] recursive sorting by elem, Michael Kay | Date | RE: [xsl] recursive sorting by elem, Scott Trenda |
Month |