XSLT中<xsl:for-each>遍历cmn:Serial失效,输出无序列号
问题分析与修复方案
嗨,我看了你的XML和XSLT代码,问题出在循环里的节点上下文处理错误啦。当你用<xsl:for-each select="cmn:Serial">遍历每个序列号节点时,当前的上下文已经是单个cmn:Serial节点了,但你在取值和判断的时候还是用了SerialNumbers/cmn:Serial这个路径——这相当于在当前cmn:Serial节点下去找子节点SerialNumbers/cmn:Serial,显然是找不到的,所以输出里就没有序列号内容了。
修正后的XSLT代码
<xsl:for-each select="cmn:Serial"> <fieldvalidation> <validtedfield>Serial</validtedfield> <value><xsl:value-of select="."/></value> <xsl:choose> <xsl:when test=". != ''"> <status>Valid</status> <reason></reason> </xsl:when> <xsl:otherwise> <status>Not Valid</status> <reason>Serial should not be empty.</reason> </xsl:otherwise> </xsl:choose> </fieldvalidation> </xsl:for-each>
关键修改点说明
- 取值部分:把
<xsl:value-of select="SerialNumbers/cmn:Serial"/>改成<xsl:value-of select="."/>,这里的.代表当前上下文节点,也就是正在循环的那个cmn:Serial节点,这样就能正确获取每个序列号的文本内容了。 - 空值判断:把
<xsl:when test="SerialNumbers/cmn:Serial != ''">改成<xsl:when test=". != ''">,同样基于当前节点判断是否为空,逻辑才会正确。
另外还要注意一个前提:你的XSLT根节点<xsl:stylesheet>一定要正确声明cmn命名空间,比如像下面这样(替换成你实际的命名空间URI):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cmn="http://your-cmn-namespace-uri-here"> <!-- 你的XSLT代码 --> </xsl:stylesheet>
如果没声明命名空间,cmn:Serial这个选择器根本匹配不到任何节点,循环都不会执行哦。
内容的提问来源于stack exchange,提问作者MK Vimalan
相关产品推荐
相关产品推荐

