XSL Соответствует первому вхождению значений в дочернем узле, затем извлекает значение из одноуровневого узла - PullRequest
0 голосов
/ 01 марта 2019

У меня есть данные XML, которые имеют структуру, как показано ниже.Я пытаюсь оценить значение Xid, чтобы увидеть, является ли остановка множественными значениями, скажем, местоположение 1 или местоположение 2, но соответствуют ли они только первому попаданию, найденному в структуре.Затем мне нужно, чтобы он вывел значение Date для этой остановки.

<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> 

1 Ответ

0 голосов
/ 01 марта 2019

Я предполагаю, что правильно сформированный 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]

, поскольку LocationRef является дочерним узлом ShipmentStop узла.

...