Subject: RE: [xsl] finding lowest level in ancestor:: axis From: Florent Georges <darkman_spam@xxxxxxxx> Date: Fri, 27 Jan 2006 00:19:48 +0100 (CET) |
Hi Is it what you're looking for? ~> cat drafts/ancestor.xml <!DOCTYPE div1 [ <!ATTLIST table id ID #IMPLIED> ]> <div1> <p>Some text here</p> <div2> <p>More text <ref idref="t1"/></p> <example> <table id='t1'/> </example> </div2> </div1> ~> cat drafts/ancestor.xsl <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:apply-templates select="//ref" mode="one"/> <xsl:text> </xsl:text> <xsl:apply-templates select="//ref" mode="two"/> </xsl:template> <xsl:template match="ref" mode="one"> <xsl:variable name="parent" select="id(@idref)/ancestor::div10 | id(@idref)/ancestor::div9 | id(@idref)/ancestor::div8 | id(@idref)/ancestor::div7 | id(@idref)/ancestor::div6 | id(@idref)/ancestor::div5 | id(@idref)/ancestor::div4 | id(@idref)/ancestor::div3 | id(@idref)/ancestor::div2 | id(@idref)/ancestor::div1"/> <xsl:value-of select="count($parent)"/> <xsl:text> / </xsl:text> <xsl:value-of select="$parent/local-name()"/> </xsl:template> <xsl:template match="ref" mode="two"> <xsl:variable name="parent" select="id(@idref)/ancestor::*[ self::div1 or self::div2 or self::div3 or self::div4 or self::div5 or self::div6 or self::div7 or self::div8 or self::div9 or self::div10 ][1]"/> <xsl:value-of select="count($parent)"/> <xsl:text> / </xsl:text> <xsl:value-of select="$parent/local-name()"/> </xsl:template> </xsl:transform> ~> saxon drafts/ancestor.xml drafts/ancestor.xsl Warning: Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor 2 / div1 1 / div2 BTW, your solution doesn't select only div1, but it's the first node of the node-set (because no more in the context of the ancestor axis where it's the last node), so it's the one used to construct your result. Regards, --drkm Dan Vint wrote: > I'm trying to build some links between a tag (table, graphic, > illustration) > and the referencing tag. So I have a <ref> tag that has an idref > attribute > that can reference these objects anywhere and these objects can > appear > directly under one of my division tags or they might be inside a > table or > code or some other lower level structure, ultimately in the link I > want to > build I need to know the containing division tag which is not always > the > immediate parent. > > So I have a document that looks like: > > <div1> > <p>Some text here</p> > <div2> > <p>More text <ref idref="t1'/></p> > <example> > <table id='t1'/> > </example> > </div2> > </div1> > > I thought the following would work: > > <template match="ref"> > <xsl:variable name="parent" > select="id(@idref)/ancestor::div10 | > id(@idref)/ancestor::div9 | > id(@idref)/ancestor::div8 | > id(@idref)/ancestor::div7 | > id(@idref)/ancestor::div6 | > id(@idref)/ancestor::div5 | > id(@idref)/ancestor::div4 | > id(@idref)/ancestor::div3 | > id(@idref)/ancestor::div2 | > id(@idref)/ancestor::div1 > "/> > <a href="{concat(generate-id($parent), '.html#', @idref)}"> > Table <xsl:number level="any" from="div1" count="table" > format="1"/> > <xsl:text> </xsl:text> > </a> > </xsl:template> > > Instead of finding the first <div2> tag this seems to always locate > the > highest ancestor in the tree and comes back with the <div1>. I even > changed > the order of the select for the variable to be high to low and low to > high > and nothing changed. I though maybe there might be an evaluation > order > going on. > > I thought about adding a [1] to each item in the select for the > variable > but I don't think that changes anything, both the div2 and div1 are > the > first of that type. I think my only option is to split this select > out into > a chose statement which would force the order, is there another way > to do > this instead of: > > <xsl:variable name="parent"> > <xsl:choose> > <xsl:when test="id(@idref)/ancestor::div10"> > <xsl:value-of select="id(@idref)/ancestor::div10"/> > </xsl:when> > .... > </xsl:choose> > </xsl:variable> > > thanks > ..dan > > PS still using XSLT v1 > --------------------------------------------------------------------------- > Danny Vint > > Specializing in Panoramic Images of California and the West > http://www.dvint.com > > voice: 510-522-4703 > > When H.H. Bennett was asked why he preferred to be out > shooting landscapes rather than spending time in his portrait studio: > > "It is easier to pose nature and less trouble to please." > > http://www.portalwisconsin.org/bennett_feature.cfm > > ___________________________________________________________________________ Nouveau : tiliphonez moins cher avec Yahoo! Messenger ! Dicouvez les tarifs exceptionnels pour appeler la France et l'international. Tilichargez sur http://fr.messenger.yahoo.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] finding lowest level in a, G. Ken Holman | Thread | [xsl] Returning HTML tags from a fu, Agnisys |
RE: [xsl] Returning HTML tags from , Michael Kay | Date | Re: [xsl] finding lowest level in a, Dan Vint |
Month |