是否有可能在XSLT中将整个源XML作为CDTA获取?

时间:2013-04-11 15:28:27

标签: xml xslt

我想在XSLT中得到这个。这可能吗?

源XML

<Parent>
   <Child></Child>
   <Child></Child>
   <Child></Child>
   <Child></Child>
</Parent>

输出XML

<Issue>
  <Node1>Something happening here</Node1>
   <Node2>Something happening here</Node2>
<Node3><![CDATA[
<Parent>
       <Child></Child>
       <Child></Child>
       <Child></Child>
       <Child></Child>
    </Parent>
]]>
</Issue>

我希望整个输入xml为<Node3>

的CDATA

这可能吗?

我的XSLT如下所示(Snippet)

    <xsl:template match="/">

      <xsl:call-template name="Issue"/>
    </xsl:template>

    <xsl:template name="Issue">
      <xsl:call-template name="Node1"/> 
      <xsl:call-template name="Node2"/> 
      <xsl:call-template name="Node3"/> 
    </xsl:template>
    ....
   <xsl:template name="Node3">
   <!-- Here as CDATA i want the input xml content-->
    </xsl:template>

任何人都可以帮我解决这个问题吗?我正在使用XSLT 1.0

1 个答案:

答案 0 :(得分:1)

在XSLT 1.0中,你可以尝试这种肮脏的技术(不能保证工作):

<xsl:template name="Node3">
  <Node3>
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
    <xsl:copy-of select="/" />
    <xsl:text>]]></xsl:text>
  </Node3>
</xsl:template>

我说“脏”,因为disable-output-escaping通常意味着你试图用锤子来驱动螺丝;即你正在使用一种工具,而不是为了服务而设计的。它不能保证工作,特别是如果XSLT处理器无法控制序列化。

你可能能够避免这种肮脏的技术。我首先要问,为什么输出XML应该在CDATA部分? CDATA要求背后几乎肯定有不同的要求(否则CDATA要求是任意的)。

也许真正的要求是你希望输出XML在输出中被转义,因此无论XML解析器读取什么,它都会将其作为文本读取而不是将其解析为树?

感谢:https://stackoverflow.com/a/1364884/423105