xsl中具有相同名称的多个标记

时间:2017-09-07 08:23:10

标签: xml xslt

以下是我的xml文件结构

<pgblk>
<task revdate='somedate'>
</task>
<task revdate='somedate'>
</task>
<task revdate='somedate'>
</task>
</pgblk>

我有很多同名的标签(任务标签),我试图在这里获得最大的revdate。我的XSLT如下:

    <xsl:template match="/">
    <xsl:variable name="updatedrevdate" select="'19000101'" />
        <xsl:for-each select="pgblk">        
            <xsl:for-each select="task">
                <xsl:when test="@revdate &gt; updatedrevdate">
                    <xsl:variable name="updatedrevdate" select="revdate" />
               ------i want to update the variable updatedrevdate to be revdate but it is not possible since reassigning a varaible is not possible in xslt-------
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>

Any possible help? Much appreciate the help in advance.

1 个答案:

答案 0 :(得分:1)

假设所有&#34;日期&#34;格式为YYYYMMDD(因此可以视为数字),您需要做的只是按降序task顺序对xsl:sort元素(使用revdate)进行排序,然后选择第一个

试试这个模板

<xsl:template match="/pgblk">
    <xsl:for-each select="task">
        <xsl:sort select="@revdate" data-type="number" order="descending" />
        <xsl:if test="position() = 1">
            <xsl:copy-of select="." />
        </xsl:if>
    </xsl:for-each>
</xsl:template>

注意我在模板中匹配pgblk,而不是xsl:for-each,因为在您的示例中,pgblk是根元素,因此只会是其中之一。

编辑:如果要将结果存储在变量中,只需将xsl:for-each包裹在xsl:variable中。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text" />

    <xsl:template match="/pgblk">
        <xsl:variable name="updatedrevdate">
            <xsl:for-each select="task">
                <xsl:sort select="@revdate" data-type="number" order="descending" />
                <xsl:if test="position() = 1">
                    <xsl:value-of select="@revdate" />
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <xsl:value-of select="$updatedrevdate" />
    </xsl:template>
</xsl:stylesheet>

http://xsltransform.net/bEzjRKy

中查看此操作