Сортировка элементов с категорией, отсутствующей в списке литературы - PullRequest
0 голосов
/ 10 сентября 2018

Это продолжение моего предыдущего вопроса; Сортировка по атрибуту, полученному из списка ссылок

Теперь я добавил два элемента VisitedCity, которые расположены в той части мира, которая не указана в списке ссылок, используемом для сортировки.Я хотел бы, чтобы все такие элементы заканчивались в конце списка, отсортированного внутри по второму ключу (Date).

Вот обновленный исходный код xml:

<?xml version="1.0" encoding="UTF-8"?> <Atlas>
    <Cities>
        <City id="1" worldPart="Africa">
            <Name>Luxor</Name>
            <Founded>-3200</Founded>
            <Location>Egypt</Location>
        </City>
        <City id="2" worldPart="Africa">
            <Name>Tripoli</Name>
            <Founded>-700</Founded>
            <Location>Libya</Location>
        </City>
        <City id="3" worldPart="Americas">
            <Name>Cholula</Name>
            <Founded>-200</Founded>
            <Location>Mexico</Location>
        </City>
        <City id="4" worldPart="Americas">
            <Name>Flores</Name>
            <Founded>-1000</Founded>
            <Location>Guatemala</Location>
        </City>
        <City id="5" worldPart="Europe">
            <Name>Argos</Name>
            <Founded>-5000</Founded>
            <Location>Greece</Location>
        </City>
        <City id="6" worldPart="Europe">
            <Name>Athens</Name>
            <Founded>-4000</Founded>
            <Location>Greece</Location>
        </City>
        <City id="7" worldPart="Asia">
            <Name>Varanasi</Name>
            <Founded>-1800</Founded>
            <Location>India</Location>
        </City>
        <City id="8" worldPart="Asia">
            <Name>Jakarta</Name>
            <Founded>397</Founded>
            <Location>Indonesia</Location>
        </City>
    </Cities>
    <VisitedCities lastUpdate="2018-09-10">
        <VisitedCity cityID="6">
            <Date>1883-08-26</Date>
            <Visitor>Dora</Visitor>
        </VisitedCity>
        <VisitedCity cityID="3">
            <Date>1907-01-02</Date>
            <Visitor>Nemo</Visitor>
        </VisitedCity>
        <VisitedCity cityID="4">
            <Date>1940-02-08</Date>
            <Visitor>Jimenez</Visitor>
        </VisitedCity>
        <VisitedCity cityID="7">
            <Date>2006-09-11</Date>
            <Visitor>Cook</Visitor>
        </VisitedCity>
        <VisitedCity cityID="2">
            <Date>1886-06-10</Date>
            <Visitor>James T. Kirk</Visitor>
        </VisitedCity>
        <VisitedCity cityID="8">
            <Date>1996-11-10</Date>
            <Visitor>Andree</Visitor>
        </VisitedCity>
    </VisitedCities> </Atlas>

Требуемый результат:следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<Atlas>
    <Cities>
        <City id="1" worldPart="Africa">
            <Name>Luxor</Name>
            <Founded>-3200</Founded>
            <Location>Egypt</Location>
        </City>
        <City id="2" worldPart="Africa">
            <Name>Tripoli</Name>
            <Founded>-700</Founded>
            <Location>Libya</Location>
        </City>
        <City id="3" worldPart="Americas">
            <Name>Cholula</Name>
            <Founded>-200</Founded>
            <Location>Mexico</Location>
        </City>
        <City id="4" worldPart="Americas">
            <Name>Flores</Name>
            <Founded>-1000</Founded>
            <Location>Guatemala</Location>
        </City>
        <City id="5" worldPart="Europe">
            <Name>Argos</Name>
            <Founded>-5000</Founded>
            <Location>Greece</Location>
        </City>
        <City id="6" worldPart="Europe">
            <Name>Athens</Name>
            <Founded>-4000</Founded>
            <Location>Greece</Location>
        </City>
        <City id="7" worldPart="Asia">
            <Name>Varanasi</Name>
            <Founded>-1800</Founded>
            <Location>India</Location>
        </City>
        <City id="8" worldPart="Asia">
            <Name>Jakarta</Name>
            <Founded>397</Founded>
            <Location>Indonesia</Location>
        </City>
    </Cities>
    <VisitedCities lastUpdate="2018-09-10">
        <VisitedCity cityID="2">
            <Date>1886-06-10</Date>
            <Visitor>James T. Kirk</Visitor>
        </VisitedCity>
        <VisitedCity cityID="6">
            <Date>1883-08-26</Date>
            <Visitor>Dora</Visitor>
        </VisitedCity>
        <VisitedCity cityID="3">
            <Date>1907-01-02</Date>
            <Visitor>Nemo</Visitor>
        </VisitedCity>
        <VisitedCity cityID="4">
            <Date>1940-02-08</Date>
            <Visitor>Jimenez</Visitor>
        </VisitedCity>
        <VisitedCity cityID="8">
            <Date>1996-11-10</Date>
            <Visitor>Andree</Visitor>
        </VisitedCity>
        <VisitedCity cityID="7">
            <Date>2006-09-11</Date>
            <Visitor>Cook</Visitor>
        </VisitedCity>
    </VisitedCities>
</Atlas>

Насколько я понимаю, index-of (), используемый в предыдущем решении Мартина Хоннена, будет содержать пустые значения последовательности, которые либо приведут эти города кбыть сброшены или отсортированы перед всеми другими городами.Есть ли способ определить «запасное» значение, которое используется вместо этих пустых значений?Или мне, возможно, нужно создать полный список ссылок, чтобы избежать этого?

Или я полностью неправильно понял index-of ()?Пожалуйста, помогите мне разобраться в этих несчастных городах!Я использую XSLT 2.0.

1 Ответ

0 голосов
/ 11 сентября 2018

Функция index-of возвращает пустую последовательность, если элемент не найден, так что вы можете решить проверить это, и в этом случае вернуть count($sort-order) + 1, компактный способ в XPath - сделать это

<xsl:sort select="(index-of($sort-order, key('city-by-id', @cityID)/@worldPart), count($sort-order) + 1)[1]"/>

https://xsltfiddle.liberty -development.net / eiZQaFJ / 1

более длинная, но, возможно, более простая в использовании версия будет заключаться в использовании `

if (empty(index-of($sort-order, key('city-by-id', @cityID)/@worldPart))) then count($sort-order) + 1 else index-of($sort-order, key('city-by-id', @cityID)/@worldPart)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...