#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 , так что в итоге вы получаете объединенную последовательность всех различных значений, только, учитывая ваш пример pathPROJECT[1]/PROPOSAL[1]/SOLUTION[1]/UNIT[1]
, кажется, что вы в любом случае выбираете только одинUNIT
, чьи различные значениядля потомкаLANDING_DOOR_FRAME_FINISH_FRONT/LANDING_DOOR_FRAME_FINISH_FRONT_VALUE
вычисляются.