Получить узел () из строки в xslt - PullRequest
1 голос
/ 29 февраля 2020

У меня есть параметр, который в данный момент читается из файла:

<xsl:param name="source" select="document('filename.xml')" />

, но теперь мне нужно заменить его строкой, содержащей xml, которая поступает из внешнего источника, и я получаю сообщение об ошибке

XPTY0019: Обязательный тип элемента первого операнда '/' - это node (); предоставленное значение имеет тип элемента xs: string`

К сожалению, я не могу использовать функцию saxon exsl:node-set(), по деловым причинам я должен использовать версию, которая ее не поддерживает. Возможно ли получить node() из строки другим способом?

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Во-первых, процесс «преобразования строки в узел» обычно называется синтаксическим анализом, и вызов процесса по собственному имени может помочь найти правильное решение.

Вы находитесь в xsl:param, что означает, что вы находитесь на границе / интерфейсе между процессором XSLT и внешним миром, и это, вероятно, означает, что у вас есть возможность выполнять анализ по обе стороны границы. Если вы не можете использовать функцию XSLT 3.0 parse-xml() или функцию расширения Saxon, которая предшествует ей, то лучше всего выполнить синтаксический анализ в вызывающем приложении и предоставить результирующий узел в качестве значения параметра. .

Функция exsl: node-set () определена для преобразования «фрагмента дерева результатов» (не строки) в набор узлов. Я полагаю, что некоторые реализации этого сделают синтаксический анализ, если снабжены строкой, а не RTF, но это никогда не было верным для саксонской реализации. В течение многих лет у Saxon была функция расширения saxon: parse (), функциональность которой очень близка к fn:parse-xml().

0 голосов
/ 29 февраля 2020

Почему бы не преобразовать процесс преобразования строки в XML? Создайте прокси-сервис, который будет использоваться для извлечения внешней строки и преобразования в ответ XML. Затем вы можете запросить XML в прокси-сервисе:

<xsl:param name="source" select="document('http://localhost/myCustomProxyService?file=filename.xml')"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...