Пожалуйста, помогите мне с этим кодом
Дорогой Сатиш,
Основная проблема предоставленного кода не в строке 20, хотя исправление этого помогает получить желаемый результат.
Основная проблема заключается в том, что в коде не используется мощная модель обработки XSLT, с помощью которой решение может быть выражено без каких-либо <xsl:for-each>
инструкций. Кроме того, код может быть сокращен и сделан более компактным, понятным и обслуживаемым.
Вот начальное решение (30 строк), которое показывает, как это можно сделать:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:v1="http://xmldefs. ag.com/Applications/eer/V1" xmlns:wsa="http://www.w3.org/2005/08/addressing"
exclude-result-prefixes="soap-env wsa v1">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:apply-templates select="soap-env:Body"/>
</xsl:template>
<xsl:template match="v1:ProcessDistr">
<ProcessDistr>
<xsl:apply-templates/>
<xsl:apply-templates select="/*/soap-env:Header/wsa:messageId"/>
</ProcessDistr>
</xsl:template>
<xsl:template match="v1:* | wsa:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="soap-env:*"><xsl:apply-templates/></xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленному документу XML:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:v1="http://xmldefs. ag.com/Applications/eer/V1" xmlns:wsa="http://www.w3.org/2005/08/addressing">
<SOAP-ENV:Header>
<wsa:messageId>04383-34380-3439939</wsa:messageId>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<v1:ProcessDistr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<v1:Group xmlns:ns2="http://xmldefs.ag.com/DD/Commons">
<v1:GroupID>437848</v1:GroupID>
<v1:GroupDetails>
<v1:GroupDetail>
<v1:language>De</v1:language>
<v1:description>Deutsch</v1:description>
</v1:GroupDetail>
<v1:GroupDetail>
<v1:language>En</v1:language>
<v1:description>English</v1:description>
</v1:GroupDetail>
</v1:GroupDetails>
<v1:Status>true</v1:Status>
<v1:Parent>45434554</v1:Parent>
</v1:Group>
<v1:Group xmlns:ns2="http://xmldefs.ag.com/DD/Commons">
<v1:GroupID>437849</v1:GroupID>
<v1:GroupDetails>
<v1:GroupDetail>
<v1:language>Tu</v1:language>
<v1:description>Turkish</v1:description>
</v1:GroupDetail>
<v1:GroupDetail>
<v1:language>Fr</v1:language>
<v1:description>French</v1:description>
</v1:GroupDetail>
</v1:GroupDetails>
<v1:Status>true</v1:Status>
<v1:Parent>45434555</v1:Parent>
</v1:Group>
</v1:ProcessDistr>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
желаемый, правильный результат получается :
<ProcessDistr>
<Group>
<GroupID>437848</GroupID>
<GroupDetails>
<GroupDetail>
<language>De</language>
<description>Deutsch</description>
</GroupDetail>
<GroupDetail>
<language>En</language>
<description>English</description>
</GroupDetail>
</GroupDetails>
<Status>true</Status>
<Parent>45434554</Parent>
</Group>
<Group>
<GroupID>437849</GroupID>
<GroupDetails>
<GroupDetail>
<language>Tu</language>
<description>Turkish</description>
</GroupDetail>
<GroupDetail>
<language>Fr</language>
<description>French</description>
</GroupDetail>
</GroupDetails>
<Status>true</Status>
<Parent>45434555</Parent>
</Group>
<messageId>04383-34380-3439939</messageId>
</ProcessDistr>
XSLT - замечательный язык, и когда он использует всю мощь, он дает нам короткие и элегантные решения. Существуют хорошие учебные ресурсы, ожидающие своего открытия.