[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Re: limiting preceding axis by ancestor
Joerg Heinicke <joerg dot heinicke at gmx dot de> wrote: > The [1] is implicit and not needed, because generate-id() on a > nodeset returns the id of the first element in this nodeset. I wrote > it for maybe better understanding. > > <xsl:if test=". = preceding::bar[generate-id(ancestor::foo[1]) = > generate-id(current()/ancestor::foo[1])]"> This is one case where the established belief that generate-id(someXPathExpression) = generate-id(someXPathExpression[1]) is *not* true. This is clearly not so, because "ancestor" is a reverse axis. generate-id(ancestor::foo[1]) will be applied on the nearest ancesstor (the last in document order) while generate-id(ancestor::foo) will be applied on the outermost ancestor (the first in document order). Here's a small example illustrating this (I'm using the "preceding" axis here, as I have a suitable xml file at hand): The source xml is: testxp17.xml: ------------ <groups> <group> <tables> <table index="1" /> <table index="2" /> </tables> <views> <view index="3" /> <view index="4" /> </views> </group> <group> <tables> <table index="1" /> </tables> <views> <view index="1" /> </views> </group> </groups> The transformation is: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:variable name="vlastView" select="(//view)[last()]"/> <xsl:variable name="vID1" select="generate-id($vlastView/preceding::tables[1])"/> <xsl:variable name="vID2" select="generate-id($vlastView/preceding::tables)"/> <xsl:value-of select="concat('generate-id($vlastView/preceding::tables[1]) = ' , $vID1 , '
 ' )"/> <xsl:value-of select="concat('generate-id($vlastView/preceding::tables) = ' , $vID2 , '
' )"/> <xsl:value-of select="concat('(gID1 = gID2) = ', $vID1 = $vID2)"/> </xsl:template> </xsl:stylesheet> The results are: 1. with Saxon: generate-id($vlastView/preceding::tables[1]) = d0e22 generate-id($vlastView/preceding::tables) = d0e5 (gID1 = gID2) = false 2. with MSXML4: generate-id($vlastView/preceding::tables[1]) = IDANMS0B generate-id($vlastView/preceding::tables) = IDACMS0B (gID1 = gID2) = false Cheers, Dimitre Novatchev. __________________________________________________ Do You Yahoo!? Yahoo! Health - your guide to health and wellness http://health.yahoo.com XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|