1

ノード内に CDATA を作成する XSLT があります。

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>

どちらが返されますか (Calabash の最新バージョンを使用):

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

XProc は disable-output-escaping 属性を尊重していないようです。

p:unescape-markup や p:string-replace のさまざまな組み合わせなど、いくつかの XProc 関数を試してみましたが、残りの出力に悪影響を与えない解決策を見つけることができませんでした。

次に試すアイデアはありますか?

4

1 に答える 1

3

doe をサポートするためにXSLT プロセッサは必要ありません。

XSLT プロセッサは、結果ツリーの出力方法を制御する場合にのみ出力エスケープを無効にでき ます。これは常に当てはまるとは限りません。たとえば、結果ツリーは、出力される代わりに、別の XSLT 変換のソース ツリーとして使用される場合があります。

これは特にパイプライン処理に当てはまります。XSLT は出力ツリーのシリアル化を制御せず、DOM または SAX イベントとしてパイプラインの次のステップに渡すだけです。でも、できたとしても、

XSLT プロセッサは、出力エスケープの無効化をサポートする必要はありません。xsl:value-of または xsl:text が出力エスケープを無効にする必要があることを指定し、XSLT プロセッサがこれをサポートしていない場合、XSLT プロセッサはエラーを通知する場合があります。エラーを通知しない場合は、出力エスケープを無効にしないことで回復する必要があります。

したがって、特にパイプラインでは、doe に頼ることはできません。

しかし、これは私が使用している API で想定されていることなので、このパターンに従うしかありません。

過去に欠陥のあるツールを使用したことがありますが、それらは入手可能な最高のものだったからです。ただし、CDATA セクションの存在 (および境界) は、XML Infoset には明示的にありません。したがって、CDATA セクションに依存する API は、その XML 入力要件に関して欠陥があります。本当に CDATA セクションに依存している場合は、バグ レポートを提出することをお勧めします。

一方、使用している API が実際には CDATA セクションを必要としない場合もあります。おそらく、何らかの方法でエスケープされた XML をフィードする必要があるだけでしょうか? その場合、XML Infoset の外部にある特定のシリアル化を必要とせずに、それを達成する他の方法があります。API に関するドキュメントを見せていただければ、実際に何が必要かを判断するのに役立ちます。

于 2015-07-15T21:53:54.550 に答える