Xslt xsl-fo中的嵌套循环
我有一个如上所示的xml文件。在我的.fo文件中,我需要这样一个循环: 每一年,, 每月 对于projectElements中的每个projectElement 年=年值 月=月值 projectElement=projectElementValue 这不起作用:Xslt xsl-fo中的嵌套循环,xslt,xsl-fo,Xslt,Xsl Fo,我有一个如上所示的xml文件。在我的.fo文件中,我需要这样一个循环: 每一年,, 每月 对于projectElements中的每个projectElement 年=年值 月=月值 projectElement=projectElementValue 这不起作用: <years> <year yearValue="2012"> <months> <month monthVal
<years>
<year yearValue="2012">
<months>
<month monthValue="4">
<projectElements>
<projectElement projectElementValue="756" />
</projectElements>
</month>
<month monthValue="8">
<projectElements>
<projectElement projectElementValue="12345" />
</projectElements>
</month>
</months>
</year>
<year yearValue="2013">
<months>
<month monthValue="8">
<projectElements>
<projectElement projectElementValue="ffff" />
<projectElement projectElementValue="12345" />
</projectElements>
</month>
</months>
</year>
</years>
我没有得到任何结果
这将按预期返回4个循环,但随后我丢失了月份和年份信息:
<xsl:for-each select="activityExport/years/year">
<xsl:for-each select="activityExport/years/year/months/month">
感谢您的帮助外部循环的上下文产生“activityExport/years/year”,因此内部循环应该相对于此路径(或月/月)。外部循环的上下文产生“activityExport/years/year”,因此内部循环应该相对于此路径(或月/月).您的第二个
有一个相对的XPath表达式,该表达式正试图处理属于当前年份的子元素的活动导出
元素(这些元素不存在,因此它们不会产生任何结果)
如果将XPath修改为相对于上下文节点(即year
元素)查看,则将获得预期的迭代次数
然后,您可以解决第二个问题,即如何从最内部的
中访问年
和月
值。下面是两个如何做到这一点的示例:
1.)为了使用嵌套的
并能够从外部
保留对上下文节点上下文的引用,您可以设置一个变量并从嵌套的
语句内部引用该变量:
<xsl:for-each select="activityExport/years/year/months/month/projectElements/projectElement">
您的第二个
有一个相对的XPath表达式,该表达式试图处理属于当前年份的子元素的活动导出
元素(这些元素不存在,因此它们不会产生任何结果)
如果将XPath修改为相对于上下文节点(即year
元素)查看,则将获得预期的迭代次数
然后,您可以解决第二个问题,即如何从最内部的
中访问年
和月
值。下面是两个如何做到这一点的示例:
1.)为了使用嵌套的
并能够从外部
保留对上下文节点上下文的引用,您可以设置一个变量并从嵌套的
语句内部引用该变量:
<xsl:for-each select="activityExport/years/year/months/month/projectElements/projectElement">
看来你只需要按照这里的建议就可以了。这是一个“上下文”的问题,你的内循环的上下文是从你的外循环的上下文开始的(正如@Kevin Brown所建议的),似乎你只需要遵循这里的建议,你就可以被设置好了。这是一个“语境”的问题,你的内循环语境是从你的外循环语境开始的(正如@Kevin Brown所建议的)
<xsl:for-each select="years/year">
<xsl:for-each select="months/month">
<xsl:for-each select="projectElements/projectElement">
<xsl:value-of select="concat('year = ', ancestor::year/@yearValue,
' month = ', ancestor::month/@monthValue,
' projectlement = ', @projectElementValue,
'
')"/>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
<xsl:for-each select="years/year/
months/month/
projectElements/projectElement">
<xsl:value-of select="concat('year = ', ancestor::year/@yearValue,
' month = ', ancestor::month/@monthValue,
' projectlement = ', @projectElementValue,
'
')"/>
</xsl:for-each>
<xsl:apply-templates select="years/year/months/month/projectElements/projectElement"/>
<xsl:template match="projectElement">
<xsl:value-of select="concat('year = ', ancestor::year/@yearValue,
' month = ', ancestor::month/@monthValue,
' projectElement = ', @projectElementValue,
'
')"/>
</xsl:template>
year = 2012 month = 4 projectElement = 756
year = 2012 month = 8 projectElement = 12345
year = 2013 month = 8 projectElement = ffff
year = 2013 month = 8 projectElement = 12345