1

我有一个 XSLT,可以在节点内创建一些 CDATA。

XML:

<test><inner>stuff</inner></test>

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="test">
        <wrapper>
                <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
                <xsl:copy-of select="*"/>
                <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
        </wrapper>
    </xsl:template>
</xsl:stylesheet>

这个通过 Saxon 执行的转换返回:

<wrapper><![CDATA[<inner>stuff</inner>]]></wrapper>

我知道我将 XML 包装在 CDATA 中,这有点荒谬。但这是我正在使用的 API 所期望的,所以我别无选择,只能遵循这种模式。

现在我试图将此转换包含在更大的 XProc 管道中:

<p:pipeline xmlns:p="http://www.w3.org/ns/xproc" version="1.0" >
<p:xslt>
    <p:input port="stylesheet">
        <p:document href="test.xsl" />
    </p:input>
</p:xslt>

返回(使用最新版本的葫芦):

<wrapper>&lt;![CDATA[<inner>stuff</inner>]]&gt;</wrapper>

XProc 似乎不支持 disable-output-escaping 属性。

我继续尝试了一些 XProc 函数,包括 p:unescape-markup 和 p:string-replace 的各种组合,但我找不到不会对我的其余输出产生不利影响的解决方案。

有什么想法我可以尝试下一步吗?

4

1 回答 1

3

XSLT 处理器不需要支持 doe

XSLT 处理器只有在控制结果树的输出方式时才能禁用输出转义 。情况可能并非总是如此。例如,结果树可以用作另一个 XSLT 转换的源树,而不是输出。

在流水线中尤其如此:XSLT 可能无法控制输出树的序列化,而只是将其作为 DOM 或 SAX 事件传递到流水线中的下一步。但即使可以,

XSLT 处理器不需要支持禁用输出转义。如果 xsl:value-of 或 xsl:text 指定应禁用输出转义并且 XSLT 处理器不支持此功能,则 XSLT 处理器可能会发出错误信号;如果它没有发出错误信号,它必须通过不禁用输出转义来恢复。

所以你真的不能依赖 doe,尤其是在管道中。

但这是我正在使用的 API 所期望的,所以我别无选择,只能遵循这种模式。

我可以同情这种情况,过去使用过有缺陷的工具,因为它们是最好的。但是,CDATA 部分的存在(和边界)明确不在XML 信息集中。因此,依赖于 CDATA 部分的 API 在其 XML 输入要求方面存在缺陷。如果它确实依赖于 CDATA 部分,最好提交一份关于它的错误报告。

另一方面,也许您正在使用的 API 实际上并不需要 CDATA 部分;也许它只需要您提供以某种方式转义的 XML 吗?如果是这样,还有其他方法可以实现这一点,而不需要 XML 信息集之外的特定序列化。如果您可以向我们展示有关 API 的文档,我们可以帮助确定它实际需要什么。

于 2015-07-15T21:53:54.550 回答