XSL:如果第一个和最后一个节点未检索



我的xml如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ExistingReservations>
    <reservations>
        <reservation>
            <type>1</type>
            <start_time>2019-03-09T16:11:14Z</start_time>
            <stop_time>2019-03-09T16:23:23Z</stop_time>
        </reservation>
        <reservation>
            <type>2</type>
            <start_time>2019-03-09T11:23:12Z</start_time>
            <stop_time>2019-03-09T11:32:18Z</stop_time>
        </reservation>
        <reservation>
            <type>2</type>
            <start_time>2019-03-09T12:23:12Z</start_time>
            <stop_time>2019-03-09T12:32:18Z</stop_time>
        </reservation>
    </reservations>
</ExistingReservations>

我只想查看" 2"类型的保留,然后获得日期范围。即第一个start_time和最后的结束时间。

,但是我在XSL上挣扎,因为我似乎无法获得第一个和最后的位置。

我的XSL如下:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="ExistingReservations">
        <ReservationSchedule>
            <xsl:for-each select="//reservation">
                <xsl:if test="type='2'">
                    <period>
                        <xsl:if test="position()=1">
                            <start_time><xsl:value-of select="start_time"/><start_time>
                        </xsl:if>
                        <xsl:if test="position() = last()">
                            <end_time><xsl:value-of select="stop_time"/></end_time>
                        </xsl:if>
                    </period>
                </xsl:if>
            </xsl:for-each>
        </ReservationSchedule>
    </xsl:template>
</xsl:stylesheet>

所以我想转换为以下内容:

<ReservationSchedule>
    <period>
        <start_time>2019-03-09T11:23:12Z</start_time>
        <end_time>2019-03-09T12:32:18Z</end_time>
    </period>
</ReservationSchedule>

我认为<xsl:if test="position()=1">在CC_1中不起作用,因为它正在查看第一个节点1。

任何帮助。

您的xsl:for-each选择所有预订,因此position()将基于选定的节点集。xsl:if不会影响position()功能。

您需要做的是更改select语句本身,因此仅选择2型的预订

<xsl:template match="ExistingReservations">
    <ReservationSchedule>
        <xsl:for-each select="//reservation[type='2']">
            <period>
                <xsl:if test="position()=1">
                    <start_time><xsl:value-of select="start_time"/></start_time>
                </xsl:if>
                <xsl:if test="position() = last()">
                    <end_time><xsl:value-of select="stop_time"/></end_time>
                </xsl:if>
            </period>
        </xsl:for-each>
    </ReservationSchedule>
</xsl:template>

另外,您可以消除xsl:for-each并以此为单写:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="ExistingReservations">
        <ReservationSchedule>
            <xsl:variable name="type2s" select="//reservation[type='2']" />
            <period>
                <start_time><xsl:value-of select="$type2s[1]/start_time"/></start_time>
                <end_time><xsl:value-of select="$type2s[last()]/stop_time"/></end_time>
            </period>
        </ReservationSchedule>
    </xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新