[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
I've observed a reproducible XSL behaviour that I just can't understand. "preceding-sibling", "following-sibling", and conditional expressions based on these axes appear to behave oddly when placed in a "for-each" element.
My observations of the unusual behavior within the "for-each" loop:
-- "following-sibling" behaves exactly as I would expect
-- "preceding sibling" unexpectedly always refers to the first sibling in the document
-- "if" statements behave erraticly: neither comparisons of current nodes to "preceding-sibling" nor comparisons to "following-sibling" appear to work completely.
I've listed some sample code below to demonstrate the problem.
Example:
My XML file:
My XSL file:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="joblist">
<xsl:for-each select="./person">
++++++++++++++++++++++++++++
<br/>
CurName=<xsl:value-of select="./name"/><br/>
CurJob=<xsl:value-of select="./job"/><br/>
<br/>
PrevName=<xsl:value-of select="./preceding-sibling::node()/name"/><br/>
PrevJob=<xsl:value-of select="./preceding-sibling::node()/job"/><br/>
NextName=<xsl:value-of select="./following-sibling::node()/name"/><br/>
NextJob=<xsl:value-of select="./following-sibling::node()/job"/><br/>
<br/>
<xsl:if test="./name=./preceding-sibling::node()/name">Name Match with Previous<br/></xsl:if>
<xsl:if test="./name=./following-sibling::node()/name">Name Match with Next<br/></xsl:if>
<xsl:if test="./job=./preceding-sibling::node()/job">Job Match with Previous<br/></xsl:if>
<xsl:if test="./job=./following-sibling::node()/job">Job Match with Next<br/></xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
The Unexpected Output:
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
[xsl] inconsistent Preceding-Sibling behaviour when nested in For-Each
Subject: [xsl] inconsistent Preceding-Sibling behaviour when nested in For-Each From: Alan Stein <as2@xxxxxxxxxxx> Date: Fri, 01 Nov 2002 22:25:07 -0500 |
I've observed a reproducible XSL behaviour that I just can't understand. "preceding-sibling", "following-sibling", and conditional expressions based on these axes appear to behave oddly when placed in a "for-each" element.
My observations of the unusual behavior within the "for-each" loop:
-- "following-sibling" behaves exactly as I would expect
-- "preceding sibling" unexpectedly always refers to the first sibling in the document
-- "if" statements behave erraticly: neither comparisons of current nodes to "preceding-sibling" nor comparisons to "following-sibling" appear to work completely.
I've listed some sample code below to demonstrate the problem.
Thanks much for any help with this. --Alan
Example:
My XML file:
<joblist> <person> <name>frank</name> <job>cook</job> </person> <person> <name>frank</name> <job>clean</job> </person> <person> <name>joe</name> <job>drive</job> </person> <person> <name>chris</name> <job>clean</job> </person> <person> <name>chris</name> <job>drive</job> </person> </joblist>
My XSL file:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="joblist">
<xsl:for-each select="./person">
++++++++++++++++++++++++++++
<br/>
CurName=<xsl:value-of select="./name"/><br/>
CurJob=<xsl:value-of select="./job"/><br/>
<br/>
PrevName=<xsl:value-of select="./preceding-sibling::node()/name"/><br/>
PrevJob=<xsl:value-of select="./preceding-sibling::node()/job"/><br/>
NextName=<xsl:value-of select="./following-sibling::node()/name"/><br/>
NextJob=<xsl:value-of select="./following-sibling::node()/job"/><br/>
<br/>
<xsl:if test="./name=./preceding-sibling::node()/name">Name Match with Previous<br/></xsl:if>
<xsl:if test="./name=./following-sibling::node()/name">Name Match with Next<br/></xsl:if>
<xsl:if test="./job=./preceding-sibling::node()/job">Job Match with Previous<br/></xsl:if>
<xsl:if test="./job=./following-sibling::node()/job">Job Match with Next<br/></xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
The Unexpected Output:
++++++++++++++++++++++++++++ CurName=frank CurJob=cook
PrevName= PrevJob= NextName=frank NextJob=clean
Name Match with Next ++++++++++++++++++++++++++++ CurName=frank CurJob=clean
PrevName=frank PrevJob=cook NextName=joe NextJob=drive
Name Match with Previous Job Match with Next ++++++++++++++++++++++++++++ CurName=joe CurJob=drive
PrevName=frank PrevJob=cook NextName=chris NextJob=clean
Job Match with Next ++++++++++++++++++++++++++++ CurName=chris CurJob=clean
PrevName=frank PrevJob=cook NextName=chris NextJob=drive
Name Match with Next Job Match with Previous ++++++++++++++++++++++++++++ CurName=chris CurJob=drive
PrevName=frank PrevJob=cook NextName= NextJob=
Name Match with Previous Job Match with Previous
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Generating schema target , Michael Kay | Thread | Re: [xsl] inconsistent Preceding-Si, Jeni Tennison |
Re: [xsl] Calling function with tex, Mike Brown | Date | Re: [xsl] inconsistent Preceding-Si, Jeni Tennison |
Month |