В XPath 1.0 есть функция current () , которая пригодится, когда я обращаюсь к узлу где-то еще в XML на основе узла, в котором я сейчас нахожусь. Мой XML имеет такую структуру:

<root>
    <book>
        <chapter>
            <section>
                <para>
                    <image id="1">1.png</image>
                </para>
            </section>
        </chapter>
    </book>
    <objects>
        <Object>
            <ID>1</ID>
        </Object>
    </objects>
</root>

Когда я обрабатываю узлы para в book , я иногда использую выражения XPath, подобные этому, для поиска информации в узлах объектов:

Object[ID=current()/descendant::image[1]/@id]

Когда я переключаю свой анализатор на XPath 2.0, это выражение выдает ошибку (функция тока недоступна).

Я провел некоторый поиск, но не смог найти прямой замены для этой функции. Есть один?

2
Hobbes 23 Мар 2017 в 14:40

2 ответа

Лучший ответ

Функция current() определена в XSLT, а не в XPath. Он доступен в выражениях XPath в таблицах стилей XSLT 1.0, 2.0 и 3.0, но недоступен в автономном XPath (ни в одной версии, кроме как, возможно, как несовместимое расширение).

В XPath 2.0 есть обходной путь с использованием переменных:

Object[ID=current()/descendant::image[1]/@id]

Становится

for $x in descendant::image[1]/@id return Object[ID=$x]
3
Michael Kay 30 Мар 2017 в 20:53

Функция current() доступна только в XSLT (все версии). Это не доступно в XPath (любая версия).

См. current() описание функции в "Дополнительные функции спецификации.

3
Daniel Haley 30 Мар 2017 в 20:49