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

时间:2019-03-08 09:20:44

标签: xslt xslt-1.0

我的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'的保留,然后获取日期范围。即第一个开始时间和最后一个结束时间。

但是我在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">中的行不通是因为它正在查看类型为1的第一个节点。即,它正在使用<xsl:if test="type='2'">逻辑。

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

您的data, label = ds.make_circles(n_samples=1000, factor=.4, noise=0.05) # Lets visualize the dataset reds = label == 0 blues = label == 1 plt.scatter(data[reds, 0], data[reds, 1], c="red", s=20, edgecolor='k') plt.scatter(data[blues, 0], data[blues, 1], c="blue", s=20, edgecolor='k') plt.show() 选择所有保留,因此xsl:for-each将基于所选的节点集。 position()不会影响xsl:if函数。

您需要做的是更改position()语句本身,因此首先只选择类型2的保留

select

或者,您也可以取消<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