xsl: вывод с использованием cdata-section-elements, не инкапсулирует целевой cdata-section-element в тег CDATA - PullRequest
1 голос
/ 09 мая 2011

Я пытаюсь:

            <!-- Arrive at the target XQuery -->
    <p:processor name="oxf:xslt">
        <p:input name="config">
            <xsl:stylesheet version="2.0">
                <xsl:output method="xml" version="1.0"
encoding="iso-8859-1" indent="yes" cdata-section-elements="text"/>
                <xsl:template match="/">
                    <xsl:variable name="apps" select="doc('input:instance')//APPLICATION"/>                         
                    <jaxrx:query>
                        <text>
xquery version "1.0";

declare namespace fn="http://www.w3.org/2005/xpath-functions";

let $dataSet := <xsl:value-of select="doc('input:request')/request/parameters/parameter[name='dataSet']/value" />
let $databaseName := <xsl:value-of select="/Configuration/XMLDB/Name/text()" />
let $applicationID := <xsl:value-of select="doc('input:request')/request/parameters/parameter[name='applicationID']/value" />

let $finalURL := fn:concat($databaseName, "/",$dataSet)
let $applicationsModified := '<xsl:copy-of select="$apps"/>'
                            <!-- disable-output-escaping not supported by Orbeon xslt processor
(: let $applicationsModified := '<xsl:text disable-output-escaping="yes">
                                <![CDATA[<]]>
                            </xsl:text>
                            <xsl:text disable-output-escaping="yes">![CDATA[</xsl:text>
                            <xsl:copy-of select="$apps"/>
                            <xsl:text>]]</xsl:text>
                            <xsl:text disable-output-escaping="yes">
                                <![CDATA[>]]></xsl:text>' :) -->
for $all in fn:collection($finalURL)
    for $anApp in $all/APPLICATION[APPLICATION_ID=$applicationID]
return 
(
replace node $anApp with $applicationsModified
)
                        </text>
                    </jaxrx:query>
                </xsl:template>
            </xsl:stylesheet>
        </p:input>
        <p:input name="data" href="#configuration"/>
        <p:input name="request" href="#request"/>
        <p:input name="instance" href="#instance"/>
        <p:output name="data" id="TargetXQuery"/>
    </p:processor>

С надеждой на получение результата, подобного

<jaxrx:query><text><![CDATA[text of xquery with embedded xml]]></text></jaxrx:query>

Но текстовое содержимое элемента text (имя элемента) не инкапсулируется вРаздел CDATA.Любые указатели, почему?

Я также попытался установить cdata-section-elements = "jaxrx: text" вместо cdata-section-elements = "text", но я все еще получаю

<text>text of xquery with embedded xml</text>

, поэтому нет инкапсуляции в разделе CDATA ...

1 Ответ

2 голосов
/ 11 мая 2011

Разделы CDATA не сохраняются как есть в конвейере. Однако эквивалентный XML InfoSet сохраняется. Например, если вы экранируете символ амперсанда, используя раздел CDATA:

<![CDATA[&]]>

Когда это проходит через конвейер, вы можете получить амперсанд, который ушел по-другому, например:

 &amp;

Если вам нужно встроить XQuery как текст в элемент XML, не стесняйтесь написать что-то вроде следующего в вашем конвейере:

<jaxrx:query><text><![CDATA[text of xquery with embedded xml]]></text></jaxrx:query>

Если вы выводите это с атрибутом «debug», вы не увидите CDATA, но ваш XQuery будет правильно экранирован.

...