2011-05-09 71 views
1

我想:的xsl:使用CDATA段元素的输出,不封装针对性的CDATA标记CDATA段元素

  <!-- 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> 
结果的希望

但是,文本(元素的名称)元素的文本内容不会封装在CDATA节中。任何指针为什么?

我自己也尝试设置CDATA段元素=:的“jaxrx文本”,而不是CDATA段元素=“文本”,但我仍然得到

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

,在CDATA所以没有封装部分...

+0

据我所知,我需要自己输出CDATA标签,是否正确?在这种情况下,我无法输出打开和关闭此CDATA标记的尖括号,而不是格式为< >格式(在我用另一种方法指出的情况下,disable-output-escaping =“yes”不会产生Orbeon中的所需结果题) – user557060 2011-05-09 12:54:44

回答

2

CDATA部分不会原样保存在管道中。但是,保留了等效的XML InfoSet。因此,举例来说,如果你逃跑用CDATA节&字符:

<![CDATA[&]]> 

当这种经过一个管道,你可能最终与符号逃脱不同,如:

&amp; 

如果你需要嵌入XQuery作为文本的XML元素,随意写的东西就像在你的管道下面:

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

如果输出这个与“调试”属性,你不会看到CDATA,但是你的XQuery将被正确地转义。