#xquery #xslt-2.0 #orbeon
#xquery #xslt-2.0 #orbeon
Вопрос:
Я пытаюсь это сделать в XQuery (предположим, что doc (‘input:instance’) действительно возвращает действительный XML-документ), который генерируется с использованием XSLT
let $a:= <xsl:text>"<xsl:copy-of select="doc('input:instance')//A" />"</xsl:text>
let $p := <xsl:text>"<xsl:copy-of select="doc('input:instance')//P" />"</xsl:text>
let $r := <xsl:text>"<xsl:copy-of select="doc('input:instance')//R" />"</xsl:text>
Но я получаю ошибку:
xsl:text must not contain child elements
Как мне получить результаты XML, используя XPath в xsl:copy-of, а затем закодировать специальные символы, полученные в результате, при форматировании результата в виде строки? Я был бы рад использовать раздел CDATA, если это возможно (если я сделаю это вместо xsl: text выше, xsl:copy-of не вычисляется, поскольку он становится частью раздела CDATA).
Очевидно, что я новичок в XSL…
Ответ №1:
Что вам здесь нужно, так это возможность сериализовать XML-документ (здесь документ, возвращаемый doc ()), используя сериализацию XML, в строку.
Различные реализации XQuery имеют функции расширения для этой цели. Например, если вы используете Saxon:
saxon:serialize(document, 'xml')
Комментарии:
1. Я использовал процессор преобразования xml в Orbeon для достижения аналогичного эффекта (сериализованный XML)
Ответ №2:
Это не имеет никакого отношения к XQuery (вы могли бы создавать таблицу стилей XSLT на любом языке, даже на XSLT itslef!).
Из http://www.w3.org/TR/xslt20/#xsl-text
<!-- Category: instruction --> <xsl:text [disable-output-escaping]? = "yes" | "no"> <!-- Content: #PCDATA --> </xsl:text>
[…] Содержимое
xsl:text
элемент — это отдельный текстовый узел, который
значение формирует строковое значение
новый текстовый узел.