我需要将XSLT1.0应用于XML。下面是我的XML的两个例子,可能有许多Financial元素,它们是无序的。
1.
<Financials>
<Financial Type="Full">
<Year>2013</Year>
</Financial>
<Financial Type="Full">
<Year>2012</Year>
</Financial>
<Financial Type="Full">
<Year>2011</Year>
</Financial>
<Financial Type="Interim">
<Year>2014</Year>
</Financial>
...
</Financials>
或
2.
<Financials>
<Financial Type="Full">
<Year>2014</Year>
</Financial>
<Financial Type="Full">
<Year>2012</Year>
</Financial>
<Financial Type="Full">
<Year>2011</Year>
</Financial>
<Financial Type="Interim">
<Year>2013</Year>
</Financial>
...
</Financials>
我需要将其映射到3个<OutputFinancial>
元素中,按年份从最近的开始排序。但条件是:
- 如果最近的元素是Type='Interim',则映射此元素以及两个Full类型元素
- 否则映射三个Full类型元素
所以输出如下:
1.
<OutputFinancials>
<OutputFinancial>
<Year>2014</Year>
</OutputFinancial>
<OutputFinancial>
<Year>2013</Year>
</OutputFinancial>
<OutputFinancial>
<Year>2012</Year>
</OutputFinancial>
</OutputFinancials>
2.
<OutputFinancials>
<OutputFinancial>
<Year>2014</Year>
</OutputFinancial>
<OutputFinancial>
<Year>2012</Year>
</OutputFinancial>
<OutputFinancial>
<Year>2011</Year>
</OutputFinancial>
</OutputFinancials>
我从开始
<OutputFinancials>
<xsl:for-each select="Financial">
<xsl:sort select="Year" data-type="number" order="descending" />
<xsl:if test="position()=1 and @Type='Interim') or ??? " />
<OutputFinancial>
<Year><xsl:value-of select="Year" /></Year>
</OutputFinancial>
</xsl:if>
</xsl:for-each>
</OutputFinancials>
您可以根据自己的条件选择具有过滤节点的相同模板。当Interim
是最新的节点时,下面的第一个调用任何类型的Financial
节点的模板。如果该条件为false,它将只过滤@Type=Full
节点并调用相同的模板。
<xsl:template match="Financials">
<xsl:choose>
<xsl:when test="Financial[@Type='Interim'][not(Year < ../Financial/Year)]">
<xsl:apply-templates select="Financial">
<xsl:sort select="Year" data-type="number" order="descending" />
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="Financial[@Type='Full']">
<xsl:sort select="Year" data-type="number" order="descending" />
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
在模板中,由于节点是有序的,您只能选择前三个:
<xsl:template match="Financial">
<xsl:if test="position() <= 3">
<OutputFinancial>
<Year><xsl:value-of select="Year" /></Year>
</OutputFinancial>
</xsl:if>
</xsl:template>
因此,第一个节点将包括三个节点,即最新的Interim
和另外两个节点(未测试任何条件(。第二个将仅包括最新的Full
节点。