0

可能重复:
尝试将 CDATA 部分插入 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 节点之后添加了两个文本节点,如下所示 <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>

4

2 回答 2

0

将元素的内容输出为 CDATA 部分很容易使用cdata-section-elements属性打开,xsl:output但您似乎还希望requestXml在输入 XML 中序列化元素内的节点以形成 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>
于 2013-01-08T13:12:37.633 回答
0

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

您是否尝试过我为您对这个问题的其他表述提出的解决方案? 我想用 > 替换 > 对于我的 xml 中的一些节点,使用 xslt

于 2013-01-08T10:57:22.013 回答