将XSLT结果包装在CDATA块中

时间:2016-11-11 19:40:01

标签: xslt cdata

我正在进行XSLT转换。

输入消息:

<Accounts operation="query">
  <Account operation="query">
    <Home_spcPage>google.com</Home_spcPage>
    <Id>1-NP8S</Id>
  </Account>
</Accounts>

应转换为:

<ipString>
 <![CDATA[<Accounts operation="update" boNameVar="Account" bcNameVar="Account">
      <Account operation="update">
         <Home_spcPage>google.com</Home_spcPage>
         <Id>1-NP8S</Id>
      </Account>
   </Accounts>]]>
</ipString>

我正在尝试使用下面的XSLT。

<xsl:stylesheet xmlns:crma="www.c123.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output indent="yes" method="xml"/>
    <xsl:variable name="messageBlock">
        <xsl:call-template name="main"/>
      </xsl:variable>
      <xsl:template match="/" name="main">
        <xsl:apply-templates select="@*|node()"/>
      </xsl:template>
      <xsl:template match="@*|node()">
        <xsl:variable name="level" select="count(ancestor::node())"/>
        <xsl:copy>
          <xsl:choose>
            <xsl:when test="$level=2">
              <xsl:attribute name="operation">
                <xsl:value-of select="'update'"/>
              </xsl:attribute>
              <xsl:variable name="currNodeVar" select="name()"/>
              <xsl:if test="$currNodeVar='Account'">
                <xsl:attribute name="boNameVar">Account</xsl:attribute>
                <xsl:attribute name="bcNameVar">Account</xsl:attribute>
              </xsl:if>
              <xsl:if test="$currNodeVar='Contact'">
                <xsl:attribute name="boNameVar">Contact</xsl:attribute>
                <xsl:attribute name="bcNameVar">Contact</xsl:attribute>
              </xsl:if>
            </xsl:when>
            <xsl:when test="$level=4">
              <xsl:attribute name="operation">
                <xsl:value-of select="'update'"/>
              </xsl:attribute>
              <xsl:variable name="currBCNameVar" select="name()"/>
              <xsl:variable name="parBCNameVar" select="name(../..)"/>
            </xsl:when>
          </xsl:choose>
        </xsl:copy>
      </xsl:template>
      <xsl:template match="/">
        <xsl:copy-of select="$messageBlock"/>
      </xsl:template>

      <xsl:template match="/">
      <xsl:element name="ipString">
          <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
          <xsl:copy-of select="$messageBlock"/>    
          <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
          </xsl:element>

        </xsl:template>
    </xsl:stylesheet>

但没有得到预期的结果。看起来XSLT并没有考虑整个XML。 任何帮助表示赞赏。

谢谢, 纳温

0 个答案:

没有答案