xslt - 如何在 xml 文件中查找开始(最小)和结束(最大)日期?

标签 xslt

我有一个 XML 文件。我应该从 field3 中找到相同的 field2 开始(最小)日期和结束(最大)日期。也许 xsl 有一些函数可以找到它。因为我尝试这样做,试图找到最小月份、最小日期和最大月份、最大日期。 XML:

<document>
    <line id="0">
        <field id="2">X111</field>
        <field id="3">2011-03-31</field>
    </line>
    <line id="1">
        <field id="2">X111</field>
        <field id="3">2011-04-04</field>
    </line>
    <line id="2">
        <field id="2">X111</field>
        <field id="3">2011-04-02</field>
    </line>
    <line id="3">
        <field id="2">X222</field>
        <field id="3">2011-04-04</field>
    </line>
    <line id="4">
        <field id="2">X222</field>
        <field id="3">2011-04-01</field>
    </line>
    <line id="4">
        <field id="2">X333</field>
        <field id="3">2011-04-01</field>
    </line>
</document>

输出:

<document>
<Message>
    <ID>X111</ID>
    <dateStart>2011-03-31</dateStart>
    <dateEnd>2011-04-04</dateEnd>
</Message>
<Message>
    <ID>X222</ID>
    <dateStart>2011-04-01</dateStart>
    <dateEnd>2011-04-04</dateEnd>
</Message>
<Message>
    <ID>X333</ID>
    <dateStart>2011-04-01</dateStart>
    <dateEnd>2011-04-01</dateEnd>
</Message>
</document>

请帮忙解决一下。我正在使用样式表版本=“1.0”。

最佳答案

这可能可以优化,但它会返回请求的结果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:key name="test" match="line" use="field[@id=2]"/>
    <xsl:template match="/">
        <document>
            <xsl:for-each select="//line[generate-id()=generate-id(key('test',field[@id=2]))]">
                <xsl:sort select="field[@id=2]"/>
                <Message>
                    <ID>
                        <xsl:value-of select="field[@id=2]"/>
                    </ID>
                    <xsl:apply-templates select="key('test',field[@id=2])">
                        <xsl:sort select="field[@id=3]"/>
                    </xsl:apply-templates>
                </Message>
            </xsl:for-each>
        </document>
    </xsl:template>
    <xsl:template match="line">
        <xsl:if test="position()=1">
            <dateStart>
                <xsl:value-of select="field[@id=3]"/>
            </dateStart>
        </xsl:if>
        <xsl:if test="position()=last()">
            <dateEnd>
                <xsl:value-of select="field[@id=3]"/>
            </dateEnd>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

关于xslt - 如何在 xml 文件中查找开始(最小)和结束(最大)日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5632028/

相关文章:

xml - 在基于 XSL 的转换后删除空的 xmlns 元素

C# 在 xml 中合并命名空间引用

c# - XSLT 与 XMLDocument 数据类型 -> 使用 foreach 循环遍历节点 -> 附加到文字控件

java - JDOM Transformer - 不要收缩空元素

xml - 是否可以用另一个 XSLT 代码(元 XSLT)转换 XSLT 代码?

javascript - 删除 javascript/jquery 中的幻像表格单元格

html - 如何在 XML 上同时使用 CSS 和 XSLT?

xml - 过滤没有属性的元素,但使用 XSLT 保留包含其父元素的元素

XML 和 XSLT 以及设置命名空间

xslt - 计算 XSLT 中的不同项目