2013-05-17 3 views
0

Нужно извлекать данные из каждого набора тегов в xml. Прямо сейчас я получаю только первый набор данных для каждой строки. Вот XML Я извлекаю данные отКак извлечь данные из массива тегов из xml в xslt

<message> 
    <Data> 
     <Name>John Doe</Name> 
     <Date>2/14/2012</Date> 
     <Phone>1234567</Phone> 
    </Data> 

    <Data> 
    <Name>Jane Doe</Name> 
     <Date>4/19/2012</Date> 
     <Phone>2345678</Phone> 
    </Data> 

    <Data> 
     <Name>Mike Doe</Name> 
     <Date>12/14/2011</Date> 
     <Phone>3456789</Phone> 
    </Data> 
    </message> 

XSLT Я использую это.

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > 
    <xsl:output method="html" version="1.1" encoding="iso-8859-1" /> 

    <xsl:template match="/message"> 
    <html> 
    <body> 
    <table border="1"> 
    <tr> 
      <th ColSpan="4">Person</th> 
    </tr> 
    <tr> 
      <th>Name</th> 
      <th>Date</th> 
     <th>Phone</th> 
      </tr> 
    <xsl:for-each select="//Data"> 
     <tr> 
    <td> 
    <xsl:value-of select="//Name" /> 
     </td> 
     <td> 
     <xsl:value-of select="//Date" /> 
     </td> 
     <td> 
     <xsl:value-of select="//Phone" /> 
     </td> 
     </tr> 
    </xsl:for-each> 
    </table> 
    </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

Мой вывод показывает только данные Джона Доу на всех трех строках.

ответ

0

Попробуйте удалить все // ...

<xsl:for-each select="Data"> 
     <tr> 
      <td> 
       <xsl:value-of select="Name" /> 
      </td> 
      <td> 
       <xsl:value-of select="Date" /> 
      </td> 
      <td> 
       <xsl:value-of select="Phone" /> 
      </td> 
     </tr> 
    </xsl:for-each> 
1
<tr> 
    <td> 
     <xsl:value-of select="//Name" /> 
    </td> 
    <td> 
     <xsl:value-of select="//Date" /> 
    </td> 
    <td> 
     <xsl:value-of select="//Phone" /> 
    </td> 
</tr> 

Ваша проблема заключается в здесь. Вы выбрали все теги данных и перебираете их, но когда вы получите это значение, вы захватываете все теги Name, Date или Phone, которые находятся в документе, а затем получают значение первого, которое это Джон Доу.

<tr> 
    <td> 
     <xsl:value-of select="Name" /> 
    </td> 
    <td> 
     <xsl:value-of select="Date" /> 
    </td> 
    <td> 
     <xsl:value-of select="Phone" /> 
    </td> 
</tr> 

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

Я бы также рекомендовал расщепить это для каждого из шаблонов в стиле XSLT. Таким образом, окончательное преобразование будет выглядеть следующим образом:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > 
    <xsl:output method="html" version="1.1" encoding="iso-8859-1" /> 
    <xsl:template match="/message"> 
     <html> 
      <body> 
       <table border="1"> 
        <tr> 
         <th ColSpan="4">Person</th> 
        </tr> 
        <tr> 
         <th>Name</th> 
         <th>Date</th> 
         <th>Phone</th> 
        </tr> 
        <xsl:apply-templates select="Data"/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="Data"> 
     <tr> 
      <td> 
       <xsl:value-of select="Name" /> 
      </td> 
      <td> 
       <xsl:value-of select="Date" /> 
      </td> 
      <td> 
       <xsl:value-of select="Phone" /> 
      </td> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 

Пример: http://www.xsltcake.com/slices/MzgTXl

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