首页 > 解决方案 > XSLT 从 xml 规则中获取第一个日期

问题描述

如何从多行中获取第一个日期?所以我得到一个带有订单的 XML,但在标题中我想要第一个请求的日期。我尝试用一​​些代码来解释:

XML:

<?xml version="1.0"?>
<xmlOrders>
  <rec>
    <supplierCode></supplierCode>
    <orderNumber>abcd</orderNumber>
    <xmlOrderLines>
      <rec>
        <orderLine>10</orderLine>
        <requestedDeliveryDate>20200707</requestedDeliveryDate>
      </rec>
      <rec>
        <orderLine>20</orderLine>
        <requestedDeliveryDate>20200916</requestedDeliveryDate>
      </rec>
      <rec>
        <orderLine>30</orderLine>
        <requestedDeliveryDate>20200601</requestedDeliveryDate>
      </rec>
    </xmlOrderLines>
  </rec>
</xmlOrders>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<DataSet>
    <vorh>
    <vorh.vorh_dat_gewenst>FIRST DATE OF ORDERLINES HERE.....</vorh.vorh_dat_gewenst>
        <xsl:for-each select="xmlOrders/rec/xmlOrderLines/rec">
        <vorr>
        <vorr.vorr_volgorde><xsl:value-of select="orderLine"/></vorr.vorr_volgorde>
        <vorr.vorr_dat_gewenst><xsl:value-of select="requestedDeliveryDate"/></vorr.vorr_dat_gewenst>
        </vorr>
        </xsl:for-each>
    </vorh>
</DataSet>
</xsl:template>
</xsl:stylesheet>

标签: xmlxslt

解决方案


如果您仅限于 XSLT 1.0,则需要使用一种相当原始的方法:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/xmlOrders">
    <DataSet>
        <vorh>
            <vorh.vorh_dat_gewenst>
                <xsl:for-each select="rec/xmlOrderLines/rec">
                    <xsl:sort select="requestedDeliveryDate" data-type="number" order="ascending"/>
                    <xsl:if test="position()=1">
                        <xsl:value-of select="requestedDeliveryDate"/>
                    </xsl:if>
                </xsl:for-each>
            </vorh.vorh_dat_gewenst>
            <xsl:for-each select="rec/xmlOrderLines/rec">
                <vorr>
                    <vorr.vorr_volgorde>
                        <xsl:value-of select="orderLine"/>
                    </vorr.vorr_volgorde>
                    <vorr.vorr_dat_gewenst>
                        <xsl:value-of select="requestedDeliveryDate"/>
                    </vorr.vorr_dat_gewenst>
                </vorr>
            </xsl:for-each>
        </vorh>
    </DataSet>
</xsl:template>

</xsl:stylesheet>

除非您的处理器恰好支持 EXSLTmath:min()扩展功能。在这种情况下,您可以这样做:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:math="http://exslt.org/math"
extension-element-prefixes="math">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/xmlOrders">
    <DataSet>
        <vorh>
            <vorh.vorh_dat_gewenst>
                <xsl:value-of select="math:min(rec/xmlOrderLines/rec/requestedDeliveryDate)"/>
            </vorh.vorh_dat_gewenst>
            <xsl:for-each select="rec/xmlOrderLines/rec">
                <vorr>
                    <vorr.vorr_volgorde>
                        <xsl:value-of select="orderLine"/>
                    </vorr.vorr_volgorde>
                    <vorr.vorr_dat_gewenst>
                        <xsl:value-of select="requestedDeliveryDate"/>
                    </vorr.vorr_dat_gewenst>
                </vorr>
            </xsl:for-each>
        </vorh>
    </DataSet>
</xsl:template>

</xsl:stylesheet>

推荐阅读