0

需要从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 信息。

4

2 回答 2

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

你的问题出在这里。您已经选择了所有数据标签并对其进行迭代,但是当您获取值时,您将获取文档中的所有名称、日期或电话标签,然后获取第一个标签的值,即是约翰·多伊的。

<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

于 2013-05-17T20:10:52.840 回答
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>
于 2013-05-17T20:09:21.317 回答