【问题标题】:XSL Match to first occurrence of values in child node, then extract value from sibling nodeXSL 匹配子节点中第一次出现的值,然后从兄弟节点中提取值
【发布时间】:2019-03-01 01:42:56
【问题描述】:

我有如下结构的 XML 数据。我正在尝试评估 Xid 值以查看停止是否是多个值,例如位置 1 或位置 2,但仅匹配它在结构中找到的第一个命中。然后我需要它输出该站点的日期值。

<ShipmentStop>
    <StopSequence>1</StopSequence>
        <LocationRef>
            <LocationGid>
                <Gid>
                    <Xid>LOCATION 1</Xid>
                </Gid>
            </LocationGid>
        <ArrivalTime>
            <EventTime>
                <EstimatedTime>
                    <Date>20181128070000</Date>
                </EstimatedTime>
            </EventTime>
        </ArrivalTime>
</ShipmentStop>
<ShipmentStop>
    <StopSequence>2</StopSequence>
        <LocationRef>
            <LocationGid>
                <Gid>
                    <Xid>LOCATION 2</Xid>
                </Gid>
            </LocationGid>
        <ArrivalTime>
            <EventTime>
                <EstimatedTime>
                    <Date>20181129070000</Date>
                </EstimatedTime>
            </EventTime>
        </ArrivalTime>
</ShipmentStop>

我正在尝试构建以下代码,但遇到了一些问题。

<xsl:for-each select="ShipmentStop[/LocationRef/LocationGid/Gid/Xid='LOCATION 1' or /LocationRef/LocationGid/Gid/Xid='LOCATION 2'][1]">
    <ArrivalTime>
        <xsl:value-of select="ArrivalTime/EventTime/EstimatedTime/Date"/>                               
    </ArrivalTime>
</xsl:for-each> 

【问题讨论】:

  • 问题不清楚。

标签: xml xslt foreach nodes


【解决方案1】:

我假设下面有一个格式良好的 XML。我添加了一个名为root的根节点:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <ShipmentStop>
        <StopSequence>1</StopSequence>
        <LocationRef>
            <LocationGid>
                <Gid>
                    <Xid>LOCATION 1</Xid>
                </Gid>
            </LocationGid>
        </LocationRef>
        <ArrivalTime>
            <EventTime>
                <EstimatedTime>
                    <Date>20181128070000</Date>
                </EstimatedTime>
            </EventTime>
        </ArrivalTime>
    </ShipmentStop>
    <ShipmentStop>
        <StopSequence>2</StopSequence>
        <LocationRef>
            <LocationGid>
                <Gid>
                    <Xid>LOCATION 2</Xid>
                </Gid>
            </LocationGid>
        </LocationRef>
        <ArrivalTime>
            <EventTime>
                <EstimatedTime>
                    <Date>20181129070000</Date>
                </EstimatedTime>
            </EventTime>
        </ArrivalTime>
    </ShipmentStop>    
</root>

在你原来的 xpath 中,你使用过

ShipmentStop[/LocationRef/LocationGid/Gid/Xid='LOCATION 1' 
    or /LocationRef/LocationGid/Gid/Xid='LOCATION 2'][1]

注意//LocationRef 中的使用。当您这样做时,您正在从 XML 的根节点进行搜索,因此它将失败。要使用上下文节点,只需在斜杠前加一个句点,如

ShipmentStop[./LocationRef/LocationGid/Gid/Xid='LOCATION 1' 
    or ./LocationRef/LocationGid/Gid/Xid='LOCATION 2'][1]

或者您可以删除 xpath 中的 ./。如:

ShipmentStop[LocationRef/LocationGid/Gid/Xid='LOCATION 1' 
    or LocationRef/LocationGid/Gid/Xid='LOCATION 2'][1]

因为LocationRefShipmentStop 节点的子节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多