XSL应用具有排序和条件的模板

时间:2014-05-16 18:16:15

标签: xml xslt xslt-1.0

我需要将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>元素,按年份排序,最近一次。但条件是:

  • 如果最近的元素是Type =&#39; Interim&#39;然后映射这个元素,也是两个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>

1 个答案:

答案 0 :(得分:0)

您可以根据您的条件选择具有已过滤节点的相同模板。下面的第一个调用任何类型的Financial节点的模板,当Interim是最新的节点时。如果该条件为false,它将仅过滤@Type=Full个节点并调用相同的模板。

<xsl:template match="Financials">
    <xsl:choose>
        <xsl:when test="Financial[@Type='Interim'][not(Year &lt; ../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() &lt;= 3">
        <OutputFinancial>
            <Year><xsl:value-of select="Year" /></Year>
        </OutputFinancial>
    </xsl:if>
</xsl:template>

所以第一个节点将包括三个节点,这些节点是最新的Interim和另外两个节点(未经过条件测试)。第二个将仅包括最新的Full节点。