将copy-of输出转换为字符串并转义XML特殊字符(例如小于(<)和大于(>)符号)

时间:2011-04-28 08:14:00

标签: xquery xslt-2.0 orbeon

我在XQuery中尝试这个(假设doc('input:instance')确实返回了一个使用XSLT生成的有效XML文档)

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

如何在xsl:copy-of中使用XPath检索XML结果,然后在将结果格式化为字符串时对结果中收到的特殊字符进行编码?我很乐意使用CDATA部分,如果可能的话(如果我这样做而不是上面的xsl:text,xsl:copy-of没有被评估,因为它成为CDATA部分的一部分)。

显然我是XSL的新手......

2 个答案:

答案 0 :(得分:0)

这与XQuery无关(你可以使用任何语言构建XSLT样式表,甚至是XSLT吧!)。

来自http://www.w3.org/TR/xslt20/#xsl-text

<!-- Category: instruction -->
<xsl:text
  [disable-output-escaping]? = "yes" | "no">
  <!-- Content: #PCDATA -->
</xsl:text>
     

[...] xsl:text的内容   element是一个单个文本节点   value形成的字符串值   新文本节点。

答案 1 :(得分:0)

这里需要的是能够使用XML序列化将XML文档(此处是doc()返回的文档)序列化为字符串。

各种XQuery实现具有用于此目的的扩展功能。例如,如果您使用的是Saxon:

saxon:serialize(document, 'xml')