麻烦使用XSLT 2.0将元素插入到xml中

时间:2014-11-13 11:04:30

标签: xml xslt xslt-2.0

我收到一条肥皂信息(XML),在添加新的XML元素后,我必须将其发送到另一个服务。是否可以使用XSLT 2.0添加元素。如果是,那怎么样?

输入讯息

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <tns:GLBookingMessage xmlns:tns="http://com.example/cdm/finance/generalledger/v1"> 
      <tns:GLBooking> 

      </tns:GLBooking>
    </tns:GLBookingMessage>
  </soapenv:Body>
</soapenv:Envelope>

必需的输出消息:

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>

    <tns:GLBookingMessage xmlns:tns="http://com.example/cdm/finance/generalledger/v1"> 
      <CHeader>
      </CHeader>    
      <tns:GLBooking> 

      </tns:GLBooking>
    </tns:GLBookingMessage>
  </soapenv:Body>
</soapenv:Envelope>

XSLT表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 

  xmlns:cdm="http://com.example//cdm/finance/generalledger/v1" 
  xmlns:tns="http://com.example//cdm/finance/generalledger/v1" 
  xmlns:cur="http://com.example//cdm/currencycodes/v1"
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
>

  <xsl:output method="xml" encoding="utf-8" indent="yes"/>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy> 
  </xsl:template>
  <xsl:template match="//GLBookingMessage">
    <GLBookingMessage>
      <xsl:copy-of select="."/> 
      <CHeader>

      </CHeader>
    </GLBookingMessage> 
  </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

试试这个: 第一个模板按原样复制所有属性和节点。 由于tns:GLBookingMessage元素是需要更改的元素,因此我们有一个模板(此模板优先于第一个模板),我们使用xsl:copy创建标记({{1} }),apply-templates属性(复制属性,在您的情况下不需要)。 然后,为所有节点()添加新元素tns:GLBookingMessage和再次apply-templates,这将调用第一个模板,从而复制CHeader的所有子节点。 / p>

tns:GLBookingMessage

您的输入XML中的XSLT中的命名空间不匹配..更正后,您可以将<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tns="http://com.example/cdm/finance/generalledger/v1"> <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="tns:GLBookingMessage"> <xsl:copy> <xsl:apply-templates select="@*"/> <CHeader/> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 移到<CHeader/>之上并将copy-of更改为

copy-of

但我的回答很好地利用了身份模板(第一个模板)进行复制..