我需要遍历一个 XML 文件的一部分,该文件列出了带有 ID 号的资源。执行此操作时,我将 ResourceId 存储在变量 $ResId 中。然后,对于每个 ResourceId,我需要遍历文件的不同部分,并使用 WorkUnitsYear 元素的 StartYear 和 StartMonth 属性总结在几个财政年度的每个财政年度中每个资源被分配给特定策略的小时数。当我省略对 WorkUnitsYear 元素的引用时,我能够对小时求和,但我无法找到正确的语法来对额外的年份和月份属性求和。所以首先我想帮助弄清楚如何包括月份和年份。
其次,我需要包含一些复杂的逻辑,以达到以下效果:if (StartYear = '2012' AND StartMonth > 6) OR (StartYear='2013' AND StartMonth < 7) sum to FY13 等几个财政年度。我不确定如何在 XSLT 中实现这个逻辑。
这是我到目前为止的部分代码。请注意,我已经重复了总和 - 一次仅使用资源 ID 和一次尝试包含年份的行。
<StrategyPool>
<Strategy Id="109">
<StrategyName>TNC CEs SECO</StrategyName>
<StrategyCalculatedCosts>
<CalculatedWho>
<ResourceId>39</ResourceId>
<ResourceId>43</ResourceId>
</CalculatedWho>
<CalculatedCosts>
<CalculatedWorkUnitsEntries>
<WorkUnitsEntry>
<WorkUnitsEntryResourceId>
<ResourceId>39</ResourceId>
</WorkUnitsEntryResourceId>
<WorkUnitsEntryDetails>
<DateUnitWorkUnits>
<WorkUnitsDateUnit>
<WorkUnitsYear StartYear="2012" StartMonth="7">
</WorkUnitsYear>
</WorkUnitsDateUnit>
<NumberOfUnits>4</NumberOfUnits>
</DateUnitWorkUnits>
</WorkUnitsEntryDetails>
</WorkUnitsEntry>
<WorkUnitsEntry>
<WorkUnitsEntryResourceId>
<ResourceId>43</ResourceId>
</WorkUnitsEntryResourceId>
<WorkUnitsEntryDetails>
<DateUnitWorkUnits>
<WorkUnitsDateUnit>
<WorkUnitsYear StartYear="2012" StartMonth="7">
</WorkUnitsYear>
</WorkUnitsDateUnit>
<NumberOfUnits>1</NumberOfUnits>
</DateUnitWorkUnits>
</WorkUnitsEntryDetails>
</WorkUnitsEntry>
</CalculatedWorkUnitsEntries>
</CalculatedCosts>
</StrategyCalculatedCosts>
</Strategy>
</StrategyPool>
预期输出是一个表格行,其中包含每个 ResourceId 的 NumberOfUnits 总和。然后我的样式表包含以下内容:
<xsl:for-each select="//StrategyPool/Strategy">
<xsl:variable name="StrategyId" select="@Id" />
<xsl:if test="StrategyCalculatedCosts/CalculatedCosts/CalculatedWho/ResourceId[text()=$ResId]">
<tr>
<td>
<xsl:value-of select="StrategyName"/>
</td>
<td>
ID = <xsl:value-of select="$StrategyId"/> <br />
<xsl:value-of select="StrategyDetails"/>
<br />
<xsl:variable name="CalcNode" select="StrategyCalculatedCosts/CalculatedCosts/CalculatedWorkUnitsEntries" />
<xsl:value-of select="sum($CalcNode/WorkUnitsEntry[WorkUnitsEntryResourceId/ResourceId=$ResId]/WorkUnitsEntryDetails/DateUnitWorkUnits/NumberOfUnits)" />
<br />
<xsl:value-of select="sum($CalcNode/WorkUnitsEntry[WorkUnitsEntryResourceId/ResourceId=$ResId]/WorkUnitsEntryDetails/DateUnitWorkUnits[WorkUnitsYear[@StartYear='2012']]/NumberOfUnits)" />
</td>
</tr>
</xsl:if>
</xsl:for-each>
包含 [value-of select="sum($CalcNode] 的第一行给出了预期的总数。下一行类似,尝试包含 StartYear 给出了意外的总数 0。我正在寻求帮助以纠正该行的语法。