Получение дублированного значения в теге xsl:for при преобразовании xml
У меня есть ниже XML
<?xml version="1.0" encoding="UTF-8"?>
<Report xmlns:fpml="http://www.fpml.org/FpML-5/confirmation" xmlns="http://www.eurexchange.com/EurexIRSFullInventoryReport" name="CB202 Full Inventory Report">
<reportNameGrp>
<CM>
<acctTypGrp name="A9">
<ProductType name="Swap">
</ProductType>
</acctTypGrp>
<acctTypGrp name="P">
<ProductType name="Swap">
</ProductType>
<ProductType name="FRA">
</ProductType>
</acctTypGrp>
</CM>
</reportNameGrp>
</Report>
и для которого я написал XSL для преобразования XML, я написал XSLT ниже
<xsl:stylesheet version="1.0" xmlns:fpml="http://www.fpml.org/FpML-5/confirmation"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:eur="http://www.eurexchange.com/EurexIRSFullInventoryReport"
xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<!-- Main Template starts from here -->
<xsl:template match="/eur:Report">
<Eurexflows>
<xsl:call-template name="EurexreportNameGrp_block">
<xsl:with-param name="CMaccounttypeGroup" select="/eur:Report/eur:reportNameGrp/eur:CM/eur:acctTypGrp" />
</xsl:call-template>
</Eurexflows>
</xsl:template>
<!-- Main tempalte ends -->
<!-- sub templates starts -->
<xsl:template name="EurexreportNameGrp_block">
<xsl:param name="CMaccounttypeGroup" />
<xsl:for-each select="$CMaccounttypeGroup">
<EurexMessageObject>
<name>
<xsl:value-of select="@name" />
</name>
<ProductType>
<xsl:value-of select="$CMaccounttypeGroup/eur:ProductType/@name" />
<xsl:call-template name="generateData">
<xsl:with-param name="data" select="."/>
</xsl:call-template>
</ProductType>
</EurexMessageObject>
</xsl:for-each>
</xsl:template>
<xsl:template name="generateData">
<xsl:param name="data" />
<xsl:for-each select="$data/eur:ProductType">
<xsl:value-of select="./@name" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
но после преобразования XSL я получаю XML в формате ниже
<Eurexflows xmlns:eur="http://www.eurexchange.com/EurexIRSFullInventoryReport"
xmlns:fpml="http://www.fpml.org/FpML-5/confirmation">
<EurexMessageObject>
<name>A9</name>
<ProductType>SwapSwap</ProductType>
</EurexMessageObject>
<EurexMessageObject>
<name>P</name>
<ProductType>SwapSwapFRA</ProductType>
</EurexMessageObject>
</Eurexflows>
но я хочу XML в этом формате,
<Eurexflows xmlns:eur="http://www.eurexchange.com/EurexIRSFullInventoryReport"
xmlns:fpml="http://www.fpml.org/FpML-5/confirmation">
<EurexMessageObject>
<name>A9</name>
<ProductType>Swap</ProductType>
</EurexMessageObject>
<EurexMessageObject>
<name>P</name>
<ProductType>Swap</ProductType>
</EurexMessageObject>
<EurexMessageObject>
<name>P</name>
<ProductType>FRA</ProductType>
</EurexMessageObject>
</Eurexflows>
Пожалуйста, узнайте, как добиться вышеупомянутого XML после преобразования, а также, пожалуйста, посоветуйте, какие необходимые изменения мне нужно сделать в xsl, особенно в моем шаблоне generateData. Пожалуйста, посоветуйте людям
1 ответ
Вы сделали XSLT излишне долго. Вы тоже можете сделать это так:
<xsl:stylesheet version="1.0" xmlns:fpml="http://www.fpml.org/FpML-5/confirmation" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:eur="http://www.eurexchange.com/EurexIRSFullInventoryReport">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/eur:Report">
<Eurexflows>
<xsl:apply-templates select="eur:reportNameGrp/eur:CM/eur:acctTypGrp/eur:ProductType"/>
</Eurexflows>
</xsl:template>
<xsl:template match="eur:ProductType">
<EurexMessageObject>
<name>
<xsl:value-of select="../@name"/>
</name>
<ProductType>
<xsl:value-of select="@name"/>
</ProductType>
</EurexMessageObject>
</xsl:template>
</xsl:stylesheet>