2014-11-13 2 views
1

Я получаю сообщение о мыле (XML), и после добавления нового элемента XML я должен отправить его дальше другому сервису. Можно ли добавить элемент с помощью XSLT 2.0. Если да, то как?Проблема Вставка элемента в xml с использованием XSLT 2.0

Input Сообщение

<?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> 
+2

Это довольно просто .. Вы что-то попробовали? –

+0

Я добавил свой лист XSLT в вопрос. –

ответ

1

Try это: Первый шаблон копирует все атрибуты и узлы, как есть. Поскольку элемент tns:GLBookingMessage является тем, который нуждается в изменении, у нас есть шаблон для этого (этот шаблон получает приоритет над первым шаблоном), в котором мы используем xsl:copy для создания тега (tns:GLBookingMessage), apply-templates для атрибутов (для копирования атрибуты, не требуемые в вашем случае). Затем добавьте новый элемент CHeader и снова применять-шаблоны для всех узлов(), который собирается вызвать первый шаблон, тем самым копирование всех детей tns:GLBookingMessage, как они ..

<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> 

Ваших Пространства имен в XSLT не соответствие в вашей входной XML .. после исправления этих, вы могли бы переместились <CHeader/> выше copy-of и путем изменения copy-of к

<xsl:copy-of select="*"/>

Но мой ответ делает хорошее применение шаблона идентичности (первый шаблон) для копирования.

+0

Спасибо, много работает. Можете ли вы просто объяснить в 1 - 2 строках, как он работает. –

+1

Я отредактировал свой ответ с некоторым объяснением .. надеюсь, что это поможет –

Смежные вопросы