Subject: [xsl] Determining the position of a specific node in the context From: "Christian Roth" <roth@xxxxxxxxxxxxxx> Date: Fri, 20 Oct 2006 01:23:54 +0200 |
Using: XPath 1 The task: I want to determine if in the current context, a node with certain properties comes before another. Example: <root> <A/> <B/> <C/> </root> I want to know whether <B/> comes before <C/>. So I thought, I would check whether the context position of <B/> is less than the context position of <C/> in the context made up of select="/root/node()". My first try: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="root"> <xsl:if test="node()[self::B]/position() < node()[self::C]/position()"> <xsl:message>B comes before C.</xsl:message> </xsl:if> </xsl:template> This gives an error in XSLT1 processors (Xalan, Saxon 6) saying position () is not a valid element test. (It sure is not.) [Side note: Testing the above in Saxon 8 (XSLT2, XPath2) does not give an error or warning, but the test simply evaluates to false. So, "node() [self::B]/position()" must be a legal XPath 2 expression - what does it actually do?] So I am back to the basic question, "How do I retrieve the position of a certain node in the context?" Next try: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="root"> <xsl:if test="count(B[1]/preceding-sibling::node()) < count(C[1]/preceding-sibling::node())"> <xsl:message>B comes before C.</xsl:message> </xsl:if> </xsl:template> This actually works, but it looks really cumbersome to me. Is there a better way to do this? Regards, Christian.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] how to keep big integer f, Lin, Jessica | Thread | Re: [xsl] Determining the position , David Carlisle |
RE: [xsl] how to keep big integer f, Michael Kay | Date | Re: [xsl] Determining the position , David Carlisle |
Month |