Xslt xsl-fo中的嵌套循环

Xslt xsl-fo中的嵌套循环,xslt,xsl-fo,Xslt,Xsl Fo,我有一个如上所示的xml文件。在我的.fo文件中,我需要这样一个循环: 每一年,, 每月 对于projectElements中的每个projectElement 年=年值 月=月值 projectElement=projectElementValue 这不起作用: <years> <year yearValue="2012"> <months> <month monthVal

我有一个如上所示的xml文件。在我的.fo文件中,我需要这样一个循环:

每一年,, 每月 对于projectElements中的每个projectElement

年=年值 月=月值 projectElement=projectElementValue

这不起作用:

    <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, 
                                      '&#xA;')"/>
     </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, 
                                 '&#xA;')"/>
</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, 
                                '&#xA;')"/>
</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