Subject: RE: [xsl] grouping sequence question From: Paul <reganmian@xxxxxxxxx> Date: Fri, 29 Nov 2002 08:59:27 -0800 (PST) |
Hey Tom Thanks you for yr interesting solution !! Paul --- TSchutzerWeissmann@xxxxxxxxxxxxxxxx wrote: > Sorry - sent the last one prematurely... > > [...] > > what if I can't evaluate by string-> > > not(start-with(@ref, 'GRP')), but need to judge > from > > whether the element can apply another templates. > > because there are lots different groups, and > naming by > > different people, etc. > > such as , I add a GRP xs:element in the schema > which > > is tailor for this 'GRP2' > > <xs:element name="GRP2"> > > <xs:complexType> > > <xs:sequence> > > <xs:element ref="GRP-for-mail" > > maxOccurs="unbounded"/> > > </xs:sequence> > > </xs:complexType> > > </xs:element> > > Nested groups are a bit more complicated, so I'm > going to stick with > defining group elements as having a ref attribute > that begins with "GRP". > > Let's say you want to output this: > Group starts > ---> apply templates to any child group (ie, > recurse) > Group ends > Group members. > > Since a "child group" isn't going to be a direct > child node, you can either > set up an XPath that can cope with the hierarchy of > xs:complexType, > xs:sequence, whatever, or you could use a key - > > <xsl:key name="childGRPs" > match="xs:element[starts-with(@ref, 'GRP')]" > > use="generate-id(ancestor::xs:element[starts-with(@ref, > 'GRP')][1])"/> > > The [1] makes sure that you only recurse one level > at a time, giving you > child groups but no grandchild groups. > > The real complication though, is the first key. This > is because you don't > want to associate elements with a preceding group > that's nested deeper than > they are, so you need to alter the preceding axis > and only consider > preceding-siblings or ancestors of > preceding-siblings... > > <xsl:key name="byGRP" > match="xs:element[not(starts-with(@ref, 'GRP'))]" > > use="generate-id(ancestor-or-self::*/preceding-sibling::xs:element > [starts-with(@ref, 'GRP')][1])"/> > > Then you just need to set the recursive template > going by sending the first > level of groups to it: > (email resumes...) > > <xsl:template match="/xs:schema/xs:element"> > <xsl:apply-templates > select="//xs:element[starts-with(@ref, 'GRP')] > > [not(ancestor::xs:element[starts-with(@ref, > 'GRP')])]" > mode="recurse"/> > </xsl:template> > > The whole thing looks like this: > > <xsl:key name="childGRPs" > match="xs:element[starts-with(@ref, 'GRP')]" > > use="generate-id(ancestor::xs:element[starts-with(@ref, > 'GRP')][1])"/> > > <xsl:key name="byGRP" > match="xs:element[not(starts-with(@ref, 'GRP'))]" > use="generate-id( > > ancestor-or-self::*/preceding-sibling::xs:element > [starts-with(@ref, 'GRP')][1])"/> > > <xsl:template match="/xs:schema/xs:element"> > <xsl:apply-templates > select="//xs:element[starts-with(@ref, 'GRP')] > > [not(ancestor::xs:element[starts-with(@ref, > 'GRP')])]" > mode="recurse"/> > </xsl:template> > > <xsl:template match="xs:element" mode="recurse"> > <!-- for each group --> > <xsl:variable name="me" select="generate-id()"/> > > Group <xsl:value-of select="@ref"/> Starts > > <xsl:apply-templates > select="key('childGRPs',$me)" mode="recurse"/> > > Group <xsl:value-of select="@ref"/> Ends. > > <xsl:for-each select="key('byGRP',$me)"> > <xsl:value-of select="@ref"/> Starts > </xsl:for-each> > > <xsl:for-each select="key('byGRP',$me)"> > <xsl:value-of select="@ref"/> Ends > </xsl:for-each> > > </xsl:template> > > > XSL-List info and archive: > http://www.mulberrytech.com/xsl/xsl-list > __________________________________________________ Do you Yahoo!? Yahoo! Mail Plus - Powerful. Affordable. Sign up now. http://mailplus.yahoo.com XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] grouping sequence questio, TSchutzerWeissmann | Thread | [xsl] IE6 cache with xsl:include by, "Braumüller, Hans" |
RE: [xsl] Using XSLT to transform X, Passin, Tom | Date | [xsl] <hr /> in XSL-FO?, Lee, Insoo |
Month |