Преобразование типа результата соединения строк в NodeList

Мне нужно иметь дело с устаревшим кодом, который оценивает выражения XPath и ожидает, что результаты разрешатся в NodeList. Код использует NodeList, чтобы определить, сколько узлов выбрано выражением XPath. Код продолжается, только если выбран один узел.

Теперь мне нужно использовать функцию соединения строк, возвращаемый тип которой — String. Есть ли способ преобразовать String в NodeList, используя другую функцию XPath? В идеале он преобразует String в NodeList с одним элементом, текстовое содержимое которого будет значением String. Я пытался использовать exsl:node-set(), но безуспешно (процессор Saxon-HE).


person jilt3d    schedule 27.01.2012    source источник


Ответы (3)


Есть ли способ преобразовать String в NodeList, используя другую функцию XPath?

Нет, XPath — это просто язык запросов для XML-документов, он не создает узлы.

Если устаревший код ожидает, что выражение XPath будет оцениваться как NodeList, а результатом оценки вашего выражения XPath будет просто строка, то для повторного использования этого устаревшего кода без написания нового кода вы должны изменить свое выражение XPath, чтобы оно выбирало одно или больше узлов.

Или напишите свой собственный код, использующий результат вычисления выражения XPath.

person Dimitre Novatchev    schedule 27.01.2012
comment
Я предполагаю, что нет альтернативы функции соединения строк, которая объединяет элементы и возвращает NodeList, первый элемент которого является результатом. Иначе было бы неловко. Я буду придерживаться изменения кода, как я описал в своем предыдущем комментарии. - person jilt3d; 27.01.2012

XPath (даже 2.0) не может создавать новые узлы, для этого вам нужен XQuery или XSLT. Saxon поддерживает оба варианта, так что у вас есть выбор.

person Martin Honnen    schedule 27.01.2012
comment
Не могли бы вы показать мне несколько примеров в контексте проблемы, пожалуйста? - person jilt3d; 27.01.2012
comment
Я могу помочь вам с XSLT, если вы покажете мне ввод, который у вас есть, и вывод, который вы хотите. Я недостаточно знаком с JAXP, чтобы советовать вам об этом. Saxon поставляется с хорошей документацией saxonica.com/documentation/using-xsl/embedding. xml, поэтому вы можете начать с него. - person Martin Honnen; 27.01.2012
comment
Что ж, выражения XPath используются вне контекста XSL. Они считываются из документа (который включает в себя различные сценарии) и оцениваются с использованием JAXP (XPathFactory, XPath, XPathExpression и т. д.). Как насчет saxon:node-set()/exsl:node-set()? Нужен ли мне Saxon-EE для работы с ними? - person jilt3d; 27.01.2012
comment
exsl:node-set берет фрагмент результирующего дерева (который в любом случае можно получить только в результате XSLT, а не чистого XPath) и преобразует его в набор узлов. Бесполезно создавать узлы из примитивных значений. - person Martin Honnen; 27.01.2012
comment
Я понимаю. Кажется, мне все равно придется изменить код. Я думал сначала оценить выражение XPath как NodeList, если есть исключение, я попытаюсь оценить его как строку. Если по-прежнему возникает исключение, это означает, что существует проблема с самим выражением XPath, и исключение будет передано соответствующему обработчику. - person jilt3d; 27.01.2012

Я бы предложил поместить слой Java вокруг Saxon XPath API и выполнить преобразование строки в NodeList на этом уровне Java. Ваш уровень Java может реализовать интерфейс JAXP XPath и, таким образом, «притвориться» настоящим механизмом XPath.

person Michael Kay    schedule 27.01.2012