2017-02-16 10 views
0

У меня есть следующий XML-файл:XSLT получить содержание различного ребенка с тем же именем узла

<?xml version="1.0" encoding="UTF-8"?> 
<group>  
    <List> 
    <id_num>1</id_num> 
    <car>cars</car> 
     <value>   
      <color>green</color> 
     <name>nissan</name> 
     </value> 
     <value>   
      <color>yellow</color> 
     <name>renault</name> 
     </value> 
     <value> 
      <color>black</color> 
      <name>ford</name> 
     </value> 
    <value_number>3</value_number> 
    </List> 

    <List> 
    <id_num>2</id_num> 
    <car>cars</car> 
     <value>   
      <color>blu</color> 
     <name>porsche</name> 
     </value> 
     <value>   
      <color>white</color> 
     <name>volvo</name> 
     </value>   
    <value_number>2</value_number> 
    </List>   
</group> 

Использование XSLT Я хотел бы получить различные содержимое Чайлдс (цвет и имя) в узле «значение», даже если он имеет то же имя реплицируются

желаемый результат будет этот XML-файл:

<?xml version="1.0" encoding="UTF-8"?> 
<group>group1</group> 
<List> 
<cars_1> 
    <car> 
     <color_info>green</color_info> 
     <brand_name>nissan</brand_name> 
    </car> 
<car> 
     <color_info>yellow</color_info> 
     <brand_name>renault</brand_name> 
</car> 
    <car> 
     <color_info>black</color_info> 
     <brand_name>ford</brand_name> 
    </car> 
</cars_1> 

<cars_2> 
    <car> 
     <color_info>blu</color_info> 
     <brand_name>porsche</brand_name> 
    </car> 
    <car> 
     <color_info>white</color_info> 
    <brand_name>volvo</brand_name> 
    </car> 
</cars_2> 
</List> 

, когда я пытаюсь использовать я не в состоянии отличить т он разные узлы с различным содержанием и, как следствие, их содержание тиражируется

это выход я получаю

<?xml version="1.0" encoding="utf-8"?> 
<group>group1</group><List> 
    <cars_1> 
    <car> 
     <color_info>green</color_info> 
     <brand_name>nissan</brand_name> 
    </car> 
    <car> 
     <color_info>yellow</color_info> 
     <brand_name>renault</brand_name> 
    </car> 
    <car> 
     <color_info>black</color_info> 
     <brand_name>ford</brand_name> 
    </car> 
    </cars_1> 
    <cars_2> 
    <car> 
     <color_info>blu</color_info> 
     <brand_name>porsche</brand_name> 
    </car> 
    <car> 
     <color_info>white</color_info> 
     <brand_name>volvo</brand_name> 
    </car> 
    </cars_2> 
</List><group>group1</group><List> 
    <cars_1> 
    <car> 
     <color_info>blu</color_info> 
     <brand_name>porsche</brand_name> 
    </car> 
    <car> 
     <color_info>yellow</color_info> 
     <brand_name>renault</brand_name> 
    </car> 
    <car> 
     <color_info>black</color_info> 
     <brand_name>ford</brand_name> 
    </car> 
    </cars_1> 
    <cars_2> 
    <car> 
     <color_info>blu</color_info> 
     <brand_name>porsche</brand_name> 
    </car> 
    <car> 
     <color_info>white</color_info> 
     <brand_name>volvo</brand_name> 
    </car> 
    </cars_2> 
</List> 

, полученный с помощью моего XSL файла:

<?xml version="1.0" encoding="UTF-8"?>   
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xlink="http://www.w3.org/1999/xlink"> 
     <xsl:output method="xml" indent="yes" encoding="utf-8" /> 


<xsl:template match="/" > 
<xsl:for-each select="group/List"> 

<group>group1</group> 
<List> 
<cars_1> 
    <car> 
     <color_info><xsl:value-of select="value/color"/> 

    </color_info> 
     <brand_name><xsl:value-of select="value/name"/></brand_name> 
    </car> 
<car> 
     <color_info>yellow</color_info> 
     <brand_name>renault</brand_name> 
</car> 
    <car> 
     <color_info>black</color_info> 
     <brand_name>ford</brand_name> 
    </car> 
</cars_1> 

<cars_2> 
    <car> 
     <color_info>blu</color_info> 
     <brand_name>porsche</brand_name> 
    </car> 
    <car> 
     <color_info>white</color_info> 
    <brand_name>volvo</brand_name> 
    </car> 
</cars_2> 
</List> 
</xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

заранее спасибо

+0

Это похоже на тривиальную задачу, используя либо '' или ''. Если вы не можете заставить его работать, отправьте свою попытку, чтобы мы могли ее исправить, вместо того, чтобы писать код для вас с нуля. - P.S. В целом, пронумерованные элементы, такие как 'cars_1',' cars_2', являются плохим дизайном XML. –

+0

@ michael.hor257k Я добавил свой файл xsl. Не могли бы вы предложить мне лучший дизайн для моего xml? спасибо –

ответ

0

Ну, если вы это сделаете:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/group" > 
    <group> 
     <xsl:for-each select="List"> 
      <cars id="{id_num}"> 
       <xsl:for-each select="value"> 
        <car> 
         <color_info> 
          <xsl:value-of select="color"/> 
         </color_info> 
         <brand_name> 
          <xsl:value-of select="name"/> 
         </brand_name> 
        </car> 
       </xsl:for-each> 
      </cars> 
     </xsl:for-each> 
    </group> 
</xsl:template> 

</xsl:stylesheet> 

вы получите:

<?xml version="1.0" encoding="UTF-8"?> 
<group> 
    <cars id="1"> 
    <car> 
     <color_info>green</color_info> 
     <brand_name>nissan</brand_name> 
    </car> 
    <car> 
     <color_info>yellow</color_info> 
     <brand_name>renault</brand_name> 
    </car> 
    <car> 
     <color_info>black</color_info> 
     <brand_name>ford</brand_name> 
    </car> 
    </cars> 
    <cars id="2"> 
    <car> 
     <color_info>blu</color_info> 
     <brand_name>porsche</brand_name> 
    </car> 
    <car> 
     <color_info>white</color_info> 
     <brand_name>volvo</brand_name> 
    </car> 
    </cars> 
</group> 

который я считаю, достаточно близко к ожидаемому результату.