Преобразовать копию выходных данных в строку и экранировать специальные символы XML (например, меньше () символов)

#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
элемент — это отдельный текстовый узел, который
значение формирует строковое значение
новый текстовый узел.