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



我需要将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 &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节点。

相关内容

  • 没有找到相关文章

最新更新