我需要将XSLT 1.0应用于XML。我的XML的两个例子如下,可能有许多金融元素,它们是无序的。
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>
元素,按年份排序,最近一次。但条件是:
因此输出如下:
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>
答案 0 :(得分:0)
您可以根据您的条件选择具有已过滤节点的相同模板。下面的第一个调用任何类型的Financial
节点的模板,当Interim
是最新的节点时。如果该条件为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
节点。