使用<xsl:for-each>遍历XML元素时重复首个元素的问题求助
解决XSLT
<xsl:for-each>重复第一个元素的问题 我来帮你搞定这个问题!你遇到的循环只重复第一个<customer>元素的情况,核心原因是XSLT路径选择的上下文搞错了,另外你的XML结构也有个小问题需要先修正。
问题1:XML缺少根元素(合法性问题)
首先你的XML片段没有根节点,这不符合XML规范,很多解析器会报错或者解析异常。你需要把所有<customer>节点包裹在一个根节点里,比如<customers>:
<?xml version="1.0" encoding="ISO-8859-1"?> <customers> <customer ref="Hannah"> <fullname> <firstname>Hannah</firstname> <lastname>Hannah</lastname> </fullname> <meter ref="Hannah"> <reading> <meterread>622224492</meterread> </reading> </meter> </customer> <customer ref="Hannah"> <fullname> <firstname>Hannah</firstname> <lastname>Hannah</lastname> </fullname> <meter ref="Hannah"> <reading> <meterread>2822222132</meterread> </reading> </meter> </customer> </customers>
问题2:XSLT路径上下文错误
在<xsl:for-each select="customer">循环内部,当前的上下文已经是每个<customer>节点了,但你写的select="customer/fullname"是从文档根节点重新查找<customer>下的<fullname>,所以每次都拿到第一个<customer>的数据。
你需要用相对路径来引用当前节点下的子元素:
- 要获取当前customer的姓名,直接写
fullname/firstname和fullname/lastname(分开显示更清晰) - 要获取当前customer的
ref属性,直接写@ref;如果是meter的ref,则写meter/@ref
修正后的XSL代码如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <xsl:for-each select="customers/customer"> <p>Name: <xsl:value-of select="fullname/firstname"/> <xsl:value-of select="fullname/lastname"/></p> <p>Customer Ref: <xsl:value-of select="@ref"/></p> <p>Meter Ref: <xsl:value-of select="meter/@ref"/></p> <p>Meter Read: <xsl:value-of select="meter/reading/meterread"/></p> <hr/> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
关键说明
<xsl:for-each select="customers/customer">:因为我们给XML加了根节点<customers>,所以这里要从根节点开始定位到所有<customer>- 循环内部的
select都是基于当前<customer>节点的相对路径,这样就能正确遍历每个customer的对应数据了
这样修改后,你的循环就能正常遍历所有<customer>元素,不会再重复第一个元素啦!
内容的提问来源于stack exchange,提问作者user11583970
相关产品推荐
相关产品推荐

