- From: Michael Kay <mhk@mhk.me.uk>
- Date: Thu, 21 Apr 2005 16:28:05 +0100
- To: "'lk'" <lalitksharma@gmail.com>, <public-qt-comments@w3.org>
The public-qt-comments list is for comments on the specifications. For help with XSLT coding, please ask on the xsl-list at http://www.mulberrytech.com/, where I'm sure we'll be able to help you with the problem. Regards, Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: public-qt-comments-request@w3.org > [mailto:public-qt-comments-request@w3.org] On Behalf Of lk > Sent: 21 April 2005 12:27 > To: public-qt-comments@w3.org > Subject: Group-starting-with problem in XSLT 2.0 > > Hi folks! > > I am using XSLT 2.0 with Altova XML Spy 2005 professional edition; > which have the inbuilt processor for XSLT 2.0; to transform one XML > file into other XML file. > > I've one XML file that contains a large amount of data with lots of > tags but without nesting/hierarchies. > > For example: > > <book> > <Story> > > <h1>chapter1</h1> > <h3>article1</h3> > <text>text text</text> > <h2>heading1</h2> > <text>text text</text> > <h3>article1</h3> > <text>text text</text> > <h2>heading2</h2> > <text>text text</text> > <h3>article1</h3> > <text>text text</text> > > <h1>chapter2</h1> > <h2>heading1</h2> > <text>text text</text> > <h3>article1</h3> > <text>text text</text> > > </Story> > </book> > > And XSLT file is like this: > <?xml version="1.0" encoding="UTF-8"?> > <xsl:stylesheet version="2.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:fo="http://www.w3.org/1999/XSL/Format" > xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns:fn="http://www.w3.org/2004/07/xpath-functions" > xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes"> > > <xsl:template match="book"> > <book> > <xsl:apply-templates /> > </book> > </xsl:template> > > <xsl:template match="Story"> > <xsl:for-each-group select="node()" group-starting-with="h1"> > <chapter> > <xsl:call-template name="h2"> > <xsl:with-param name="child.elements" > select="current-group()"></xsl:with-param> > </xsl:call-template> > </chapter> > </xsl:for-each-group> > </xsl:template> > > <xsl:template name="h2"> > <xsl:param name="child.elements"></xsl:param> > <xsl:for-each-group select="$child.elements" > group-starting-with="h2"> > <xsl:choose> > <xsl:when test="current-group()[1][self::h1]"> > <xsl:apply-templates > select="current-group()"/> > </xsl:when> > <xsl:otherwise> > <heading> > <xsl:call-template name="h3"> > <xsl:with-param name="child.elements" > select="current-group()"></xsl:with-param> > </xsl:call-template> > </heading> > </xsl:otherwise> > </xsl:choose> > </xsl:for-each-group> > </xsl:template> > > <xsl:template name="h3"> > <xsl:param name="child.elements"></xsl:param> > <xsl:for-each-group select="$child.elements" > group-starting-with="h3"> > <xsl:choose> > <xsl:when test="current-group()[1][self::h1 or > self::h2]"> > <xsl:apply-templates > select="current-group()"/> > </xsl:when> > <xsl:otherwise> > <article> > <xsl:apply-templates select="current-group()"/> > </article> > </xsl:otherwise> > </xsl:choose> > </xsl:for-each-group> > </xsl:template> > > <xsl:template match="h1 | h2 | h3"> > <title><xsl:apply-templates /></title> > </xsl:template> > > <xsl:template match="*"> > <xsl:copy> > <xsl:apply-templates/> > </xsl:copy> > </xsl:template> > > </xsl:stylesheet> > > If the highlighted <h3>article1</h3> line is not in there in source > XML file, then it gives the absolutely correct result as I want. > > For example: > > <?xml version="1.0" encoding="UTF-8"?> > <book xmlns:fn="http://www.w3.org/2004/07/xpath-functions" > xmlns:fo="http://www.w3.org/1999/XSL/Format" > xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes" > xmlns:xs="http://www.w3.org/2001/XMLSchema"> > <chapter> > <title>chapter1</title> > <text>text text</text> > <heading> > <title>heading1</title> > <text>text text</text> > <article> > <title>article1</title> > <text>text text</text> > </article> > </heading> > <heading> > <title>heading2</title> > <text>text text</text> > <article> > <title>article1</title> > <text>text text</text> > </article> > </heading> > </chapter> > <chapter> > <title>chapter2</title> > <heading> > <title>heading1</title> > <text>text text</text> > <article> > <title>article1</title> > <text>text text</text> > </article> > </heading> > </chapter> > </book> > > But if that <h3>article1</h3> line is there in XML file as shown > above, it gives me wrong result. > > For example : (result with <h3>article1</h3> line in source XML file) > > <?xml version="1.0" encoding="UTF-8"?> > <book xmlns:fn="http://www.w3.org/2004/07/xpath-functions" > xmlns:fo="http://www.w3.org/1999/XSL/Format" > xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes" > xmlns:xs="http://www.w3.org/2001/XMLSchema"> > <chapter> > <title>chapter1</title> > <title>article1</title> > <text>text text</text> > <heading> > <title>heading1</title> > <text>text text</text> > <article> > <title>article1</title> > <text>text text</text> > </article> > </heading> > <heading> > <title>heading2</title> > <text>text text</text> > <article> > <title>article1</title> > <text>text text</text> > </article> > </heading> > </chapter> > <chapter> > <title>chapter2</title> > <heading> > <title>heading1</title> > <text>text text</text> > <article> > <title>article1</title> > <text>text text</text> > </article> > </heading> > </chapter> > </book> > > It means, if all my source elements come in proper order it works > fine, but if any one of them is incorrectly or knowingly places in the > source XML file. its gives the in-correct result. > > Is there anybody who can help me out? > --------------------------------------------------------- > Thanks & regards, > > Lalit K Sharma > Software Engineer > Rough Guides India (Pearson Group) http://www.roughguides.com > New Delhi, India > Official email Id: lalit.sharma@roughguides.com > Personal email Id/s: lalit_k_sharma@yahoo.com , lalitksharma@gmail.com >
Received on Thursday, 21 April 2005 15:28:14 UTC