Subject: Re: [xsl] XPath problem with getting all ancestors From: Jostein Austvik Jacobsen <josteinaj@xxxxxxxxx> Date: Fri, 23 Oct 2009 14:03:55 +0200 |
Ok, I've stripped it down a fair bit. When I run this: <?xml version="1.0" encoding="utf-8"?> <document> <article> <meta> <title>Title</title> </meta> <content> <para> <note id="1">text</note> </para> </content> </article> </document> through this: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mf="http://example.com/2009/mf" exclude-result-prefixes="xs mf"> <xsl:template match="document"> <document> <meta/> <content> <xsl:for-each select="article"> <xsl:sort select="(.//@page)[1]"/> <xsl:apply-templates select="article"/> </xsl:for-each> <xsl:apply-templates/> </content> </document> </xsl:template> <xsl:template match="article"> <xsl:variable name="v1"> <xsl:copy-of select="content/node()"/> </xsl:variable> <xsl:sequence select="mf:group($v1/node())"/> </xsl:template> <xsl:function name="mf:group" as="node()*"> <xsl:param name="nodes" as="node()*"/> <xsl:for-each-group select="$nodes" group-starting-with="foo"> <xsl:apply-templates/> </xsl:for-each-group> </xsl:function> <xsl:template match="note"> The note at /article/content/para/note reads: ancestors="<xsl:value-of select="count(ancestor::*)"/>" preceding="<xsl:value-of select="count(preceding::*)"/>" contentNum="<xsl:value-of select="count(preceding::content)"/>" numberTest="<xsl:number level="any" count="content"/>" </xsl:template> </xsl:stylesheet> I get this: <?xml version="1.0" encoding="UTF-8"?> <document> <meta/> <content> The note at /article/content/para/note reads: ancestors="1" preceding="0" contentNum="0" numberTest="" </content> </document> In this case I would expect: ancestors="3" (para,content,article) preceding="2" (meta,title) But I guess I'm applying the template in a wrong way? Regards Jostein 2009/10/23 Jostein Austvik Jacobsen <josteinaj@xxxxxxxxx>: > David/Syd: I tried replacing the value-of with <xsl:number level="any" > count="content"/>, but it returned nothing. I'm sure I'm using it > wrong though so I'll have myself a read on xsl:number. > Syd: Sorry about the misplaced match. I tried it myself now and > actually got the same as you. > Syd/Michael: I'll try to strip down my stylesheet to localize the > problem further, then I'll post it back here. > > Thanks > Jostein > > 2009/10/23 Michael Kay <mike@xxxxxxxxxxxx>: >> >> My guess (and it's a completely wild one) is that you aren't applying >> templates to the note element in the source tree as you have shown it, but >> to a copy of the note element in some smaller tree, probably a tree rooted >> at the para element. >> >> To confirm that we would need to see more of the stylesheet. Or, within the >> match="note" template, do >> >> <xsl:message><xsl:copy-of select="/"/></xsl:message> >> >> to see what tree you are processing at the time. >> >> Regards, >> >> Michael Kay >> http://www.saxonica.com/ >> http://twitter.com/michaelhkay >> >>> -----Original Message----- >>> From: Jostein Austvik Jacobsen [mailto:josteinaj@xxxxxxxxx] >>> Sent: 23 October 2009 11:27 >>> To: xsl-list >>> Subject: [xsl] XPath problem with getting all ancestors >>> >>> I've got a document like this: >>> >>> <?xml version="1.0" encoding="utf-8"?> >>> <document> >>> <article> >>> <meta> >>> <title>Title</title> >>> </meta> >>> <content> >>> <headline>Headline</headline> >>> <para> >>> <note id="1">text</note> >>> </para> >>> </content> >>> </article> >>> </document> >>> >>> And in a template for the note tags I'm trying to use the >>> ancestor axis to get the list [ para , content , article ]. >>> However, I only seem to get [ para ] with ancestor::* and [ para , "" >>> ] with ancestor::node(). >>> When I test it like this: >>> >>> <xsl:template match="note"> >>> ancestors="<xsl:value-of select="count(ancestor::*)"/>" >>> preceding="<xsl:value-of select="count(preceding::*)"/>" >>> contentNum="<xsl:value-of >>> select="count(preceding::content)"/>" >>> </xsl:template match> >>> >>> ...I get ancestors="1", preceding="2" and contentNum="0" as output. >>> >>> What I actually need to do is to count the number of content >>> nodes preceding the current note (relevant for the input XML >>> note numbering scheme). I did so earlier in the document (for >>> referencing the actual >>> notes) when matching document like this: >>> >>> <xsl:template match="document"> >>> (...) >>> <xsl:for-each select="//note"> >>> <note> >>> <xsl:attribute name="id"><xsl:value-of >>> select="count(ancestor::content/preceding::content)"/></xsl:attribute> >>> <p><xsl:apply-templates/></p> >>> </note> >>> </xsl:for-each> >>> (...) >>> </xsl:template> >>> >>> So here I get access to all of the notes ancestors. In >>> retrospect I could probably have used >>> select="count(preceding::content)" instead, but still... >>> >>> How come that I cannot access the notes ancestors from my >>> note template? >>> >>> Regards >>> Jostein
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] XPath problem with gettin, Jostein Austvik Jaco | Thread | Re: [xsl] XPath problem with gettin, Vyacheslav Sedov |
Re: [xsl] XPath problem with gettin, Jostein Austvik Jaco | Date | Re: [xsl] XPath problem with gettin, Vyacheslav Sedov |
Month |