如何将数据从xml中的标记数组提取到xslt

时间:2013-05-17 19:31:17

标签: xml xslt

需要从xml中的每组标签中提取数据。现在我只获取每一行的第一组数据。这是我从

中提取数据的XML
 <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>

我的输出仅显示John Doe关于所有三行的信息。

2 个答案:

答案 0 :(得分:1)

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

你的问题在于此。您已选择所有数据标记并正在迭代它们,但是当您获得该值时,您将获取文档中的所有名称,日期或电话标记,然后获取第一个的值,是John Doe的。

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

因为在for-each中,您处于Data标记的范围内,所以您只需使用该名称来选择子节点。

为了XSLT中的样式,我还建议将for-each分成模板。所以,你的最终转换看起来像这样:

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

答案 1 :(得分: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>