我收到一条肥皂信息(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>
答案 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
但我的回答很好地利用了身份模板(第一个模板)进行复制..