尝试使用xslt将DATA文本插入到xml中

时间:2013-01-08 10:36:24

标签: xml xpath xslt-1.0

  

可能重复:
  trying to insert CDATA section into a xml

我正在努力将其归入xml,但却低于错误  XSLT错误(javax.xml.transform.TransformerException):XML文档结构必须在同一实体中开始和结束。 线程“main”中的异常java.lang.RuntimeException:XML文档结构必须在同一实体内开始和结束。

输入xml

 <Create>
 <requestXml>
 <ISD_XMLGateway>
  <Entity>HLR_ALC</Entity>
  <Origin>Comverse One</Origin>
  <Log_Level>0</Log_Level>
  <Params>
  <Param Name="HLR_System" Value="JT"/>
  <Param Name="HLR_ALC_Command" Value="Send_HLR_Command"/>
  <Param Name="HLR_Command"   Value="CRESBX:MSIN=Start43515213,MODEL=MODEL002,SNBSV=7797098765-TEL;"/>
     </Params>
                                         </ISD_XMLGateway>
                          </requestXml>
            </Create>

输出我期待的是

 <Create>
 <requestXml><![CDATA[
 <ISD_XMLGateway>
 <Entity>HLR_ALC</Entity>
 <Origin>Comverse One</Origin>
 <Log_Level>0</Log_Level>
 <Params>
  <Param Name="HLR_System" Value="JT"/>
  <Param Name="HLR_ALC_Command" Value="Send_HLR_Command"/>
   <Param Name="HLR_Command" Value="CRESBX:MSIN=Start43515213,MODEL=MODEL002,SNBSV=7797098765-TEL;"/>
   </Params>
   </ISD_XMLGateway>]]>
                          </requestXml>
            </Create>

在XSL中,我在下面的requestXml nodeas之后添加了两个文本节点     <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>

2 个答案:

答案 0 :(得分:0)

此页面似乎有您正在寻找的答案: http://www.bernzilla.com/2008/02/12/utilizing-cdata-section-elements-in-xsl/

您是否尝试过针对此问题的其他表述而提出的解决方案? i want to replace > with &gt; for some of my nodes in my xml using xslt

答案 1 :(得分:0)

使用cdata-section-elements上的xsl:output属性很容易将元素的内容输出为CDATA部分,但您似乎也希望序列化输入XML中requestXml元素内的节点形成CDATA部分的内容。要序列化,您需要检查您的XSLT处理器是否支持扩展,或者您需要使用XSLT 1.0样式表来执行此操作,例如http://lenzconsulting.com/xml-to-string/上提供的。

然后,您可以导入该样式表并按如下方式使用它:

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:import href="xml-to-string.xsl"/>

<xsl:output method="xml" cdata-section-elements="requestXml"/>

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="requestXml">
  <xsl:copy>
    <xsl:call-template name="xml-to-string">
      <xsl:with-param name="node-set" select="node()"/>
    </xsl:call-template>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

那样输入

<Create>
 <requestXml>
 <ISD_XMLGateway>
  <Entity>HLR_ALC</Entity>
  <Origin>Comverse One</Origin>
  <Log_Level>0</Log_Level>
  <Params>
  <Param Name="HLR_System" Value="JT"/>
  <Param Name="HLR_ALC_Command" Value="Send_HLR_Command"/>
  <Param Name="HLR_Command"   Value="CRESBX:MSIN=Start43515213,MODEL=MODEL002,SNBSV=7797098765-TEL;"/>
     </Params>
                                         </ISD_XMLGateway>
                          </requestXml>
            </Create>

转换为结果

<Create>
 <requestXml><![CDATA[
 <ISD_XMLGateway>
  <Entity>HLR_ALC</Entity>
  <Origin>Comverse One</Origin>
  <Log_Level>0</Log_Level>
  <Params>
  <Param Name="HLR_System" Value="JT"/>
  <Param Name="HLR_ALC_Command" Value="Send_HLR_Command"/>
  <Param Name="HLR_Command" Value="CRESBX:MSIN=Start43515213,MODEL=MODEL002,SNBSV=7797098765-TEL;"/>
     </Params>
                                         </ISD_XMLGateway>
                          ]]></requestXml>
            </Create>