XSLT中for-each超出MeetingPollingQuestion节点问题咨询
问题解决方法
核心问题原因
你使用的//MeetingPollingParts是全局路径选择器,会从XML根节点开始匹配所有MeetingPollingParts节点,完全忽略当前MeetingPollingQuestion的上下文范围,因此会超出目标节点的范围。
具体修改步骤
1. 限定MeetingPollingParts的上下文范围
将内部的<xsl:for-each select="//MeetingPollingParts">修改为:
<xsl:for-each select="MeetingPollingParts/MeetingPollingParts">
- 说明:当前上下文是
MeetingPollingQuestion节点,MeetingPollingParts/MeetingPollingParts表示当前节点下的MeetingPollingParts容器内的所有子MeetingPollingParts节点,只会选中当前问题对应的选项部分。
2. 修正单选框选项的取值路径
在MeetingPollingPartsTypeId = 3的分支里,原取值路径错误,修改为:
<xsl:value-of select="QuestionValue" disable-output-escaping="yes"/>
- 说明:此时上下文是
MeetingPollingPartsValues节点,直接取自身的QuestionValue即可,无需多层回溯。同时注意MeetingPollingPartsValues是嵌套结构,循环时需要遍历MeetingPollingPartsValues/MeetingPollingPartsValues才能正确获取每个选项。
修改后的完整XSLT代码
<xsl:template match="//ArrayOfMeetingPollingQuestion"> <xsl:for-each select="//MeetingPollingQuestion"> <div class="portlet box blue sortable page-break-before: always" style="page-break-after: always;border: 1px solid #0265A6;"> <div class="portlet-title" style="background-color: #0265A6;min-height:41px"> <xsl:choose> <xsl:when test="MeetingPollingQuestionTypeId = 2"> <div class="caption"> <i class="fa fa-th"></i>Multiple Choice </div> <div class="portlet-body" style="background-color: #fff;padding: 15px;"> <!-- 修正:使用相对路径限定当前Question下的Parts --> <xsl:for-each select="MeetingPollingParts/MeetingPollingParts"> <xsl:choose> <xsl:when test="MeetingPollingPartsTypeId = 1"> <div class="row"> <div class="col-md-12"> <div class="form-group"> <xsl:value-of select="MeetingPollingPartsValues/MeetingPollingPartsValues/QuestionValue" disable-output-escaping="yes"/> </div> </div> </div> </xsl:when> <xsl:when test="MeetingPollingPartsTypeId = 3"> <!-- 修正:遍历嵌套的MeetingPollingPartsValues节点 --> <xsl:for-each select="MeetingPollingPartsValues/MeetingPollingPartsValues"> <div class="row"> <div class="col-md-12"> <div class="form-group"> <input type="radio"></input> <label> <!-- 修正:直接取当前节点的QuestionValue --> <xsl:value-of select="QuestionValue" disable-output-escaping="yes"/> </label> </div> </div> </div> </xsl:for-each> </xsl:when> </xsl:choose> </xsl:for-each> </div> </xsl:when> </xsl:choose> </div> </div> </xsl:for-each> </xsl:template>
内容的提问来源于stack exchange,提问作者Jefferson
相关产品推荐
相关产品推荐

