2014-12-13 1 views
0

У меня есть ниже XMLполучать дублируется значение в XSL: для тега в то время как преобразование 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 в этом е Ormat,

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

пожалуйста avise, как достичь выше XML после преобразования, а также просьба сообщить, что необходимые изменения мне нужно сделать в XSL специально в моих generateData template..please советуют людям

ответ

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> 
Смежные вопросы