Может ли массив атомарных значений быть именем узла в запросе XPath?

#saxon #xpath-3.1

#saxon #xpath-3.1

Вопрос:

Для запроса «PROJECT[1]/PROPOSAL[1]/SOLUTION[1]/UNIT[1]/distinct-values(LANDING_DOOR_FRAME_FINISH_FRONT/LANDING_DOOR_FRAME_FINISH_FRONT_VALUE) » похоже, это работает, если distinct-values() возвращает ровно одно значение, но в противном случае генерирует исключение. (И, кстати, этот запрос — не моя идея).

Разве плохая идея использовать атомарное значение в качестве имени узла в запросе? Или это нормально? И если нормально, нормально ли это, только если оно возвращает ровно одно значение?

Для этого вызываем Saxon из Java.

Ответ №1:

Это абсолютно корректный запрос, независимо distinct-values() от того, возвращает он ровно одно значение или нет.

(Если это не удается, покажите нам репро: все данные, которые нам нужны для воспроизведения проблемы, плюс сообщение об ошибке).

Но ваш вопрос об использовании атомарных значений в качестве имен узлов предполагает, что вы не понимаете, что означает выражение. Значения, возвращаемые distinct-values(), не обязательно должны быть именами узлов, и они не используются в качестве имен узлов.

В наши дни я предпочитаю использовать оператор «!», когда выражение RHS возвращает атомарные значения, а не узлы. Это эквивалентно, но понятнее.

Комментарии:

1. Что именно тогда происходит с этим запросом? Возвращает ли он отдельные значения в PROJECT[1]/PROPOSAL[1]/ SOLUTION[1]/UNIT[1]/LANDING_DOOR_FRAME_FINISH_FRONT/LANDING_DOOR_FRAME_FINISH_FRONT_VALUE в виде атомарных значений? Или что-то еще? Спасибо

2. @DavidThielen, если у вас есть вызов функции на последнем шаге выражения пути, например, foo/bar/distinct-values(foobar) тогда это в основном for $bar in foo/bar return distinct-values($bar/foobar) , см. w3.org/TR/xpath-31/#id-path-operator , так что в итоге вы получаете объединенную последовательность всех различных значений, только, учитывая ваш пример path PROJECT[1]/PROPOSAL[1]/SOLUTION[1]/UNIT[1] , кажется, что вы в любом случае выбираете только один UNIT , чьи различные значениядля потомка LANDING_DOOR_FRAME_FINISH_FRONT/LANDING_DOOR_FRAME_FINISH_FRONT_VALUE вычисляются.