Subject: RE: [xsl] filter From: Paul <reganmian@xxxxxxxxx> Date: Wed, 4 Dec 2002 10:19:00 -0800 (PST) |
Thanks Tom, you always take sth new to me. Paul --- TSchutzerWeissmann@xxxxxxxxxxxxxxxx wrote: > Hi Paul, > > > and the fact is group element will always apply to > > > a structure: > > > /xs:element/xs:complexType/xs:sequence/xs:element > with > > the occuring of @maxOccurs attribute > > The "/" at the beginning of that XPath is my typo - > it shouldn't be there > because it's short for the document root. The only > element in the schema > that is a child of / is the top node, xs:schema. > > Group on > xs:element[xs:complexType/xs:sequence/xs:element/@maxOccurs]. > You > don't need "boolean" - if the expression in the > predicate is the empty > node-set then it's equivalent to false. > > The negative version of the filter is > > xs:element[not(xs:complexType/xs:sequence/xs:element/@maxOccurs)] > > This is the modified version...(untested) > > ============================================================ > > <xsl:key name="childGroups" > match="xs:element[xs:complexType/xs:sequence/xs:element/@maxOccurs]" > use="generate-id( > > (ancestor::xs:element[xs:complexType/xs:sequence/xs:element/@maxOccurs][1] > | /)[last())"/> > > <!-- the ( xyz | / )[last()] will always give you > xyz if it exists, > otherwise the root node. > This is because the root node is the very first > node, so any node > comes later than it > and will be last of the pair > > So we can refer to the top group using this key and > the id of the > root element, instead of > using a long XPath nightmare > --> > > <xsl:key name="byGroup" > match="xs:element[not(xs:complexType/xs:sequence/xs:element/@maxOccurs)]" > use="generate-id( > > ancestor-or-self::*/preceding-sibling::xs:element > > [xs:complexType/xs:sequence/xs:element/@maxOccurs][1]"/> > > <!-- notice that the match is just on xs:element --> > > <xsl:template match="/xs:schema/xs:element"> > <xsl:apply-templates > select="key('childGroups',generate-id(/))" > 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('childGroups',$me)" mode="recurse"/> > > Group <xsl:value-of select="@ref"/> Ends. > > <xsl:for-each select="key('byGroup',$me)"> > <xsl:value-of select="@ref"/> Starts > </xsl:for-each> > > <xsl:for-each select="key('byGroup',$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] filter, TSchutzerWeissmann | Thread | RE: [xsl] filter, Paul |
Re: [xsl] debugging techniques [was, Jeff Kenton | Date | RE: [xsl] debugging techniques [was, Américo Albuquerque |
Month |