1

我正在尝试从 uniprot XML 文件中选择一些数据,并且我能够得到我想要的大部分内容,但是我在获取同一节点中有更多条目的数据时遇到了问题。为了更容易,我将使用众所周知的 CD 收藏数据来展示我想要的东西。我还想知道将输出保存为 .csv 或 .txt 文件的最简单方法是什么。谢谢!让我知道是否有任何不清楚的地方。

XML 代码:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <company>ABC</company>
        <price>10.90</price>
        <year>1985</year>
    </cd>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>
        <company>CBS Records</company>
        <company>ABC</company>
        <price>9.90</price>
        <year>1988</year>
    </cd>
    <cd>
        <title>Greatest Hits</title>
        <artist>Dolly Parton</artist>
        <country>USA</country>
        <company>RCA</company>
        <price>9.90</price>
        <year>1982</year>
    </cd>
</catalog>

当前 XSLT 代码:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
    <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Artist</th>
        <th>Company</th>
      </tr>
    <xsl:apply-templates />
    </table>
  </body>
  </html>
</xsl:template>

    <xsl:template match="catalog/cd">
      <tr>
        <xsl:apply-templates select="title|artist|company"/>
      </tr>
    </xsl:template>


    <xsl:template match="title|artist|company">
      <td>
        <xsl:value-of select="."/>
      </td>
    </xsl:template>

</xsl:stylesheet>

电流输出:

My CD Collection

Title           Artist          Company
Empire Burlesque    Bob Dylan   Columbia    ABC
Hide your heart Bonnie Tyler    CBS Records ABC
Greatest Hits   Dolly Parton    RCA

所以我得到了我想要的所有数据,但我希望“公司”结果在 1 列中,如下所示:Columbia;ABC

此外,在我使用的文件中,同一节点中有更多条目是很常见的。但是,对于大多数人来说,我只想要第一个而不是全部,仅适用于某些节点。你怎么区分这两个?当我使用

<xsl:for-each select="uniprot/entry"> 
  <tr>
    <td>
      <xsl:value-of select="name"/>
    </td>
  </tr>

它只返回第一项。所以主要是我想要这个,但我认为我需要其他我想要所有条目的节点。如果你能帮我解决这个问题,那就太好了。

4

1 回答 1

1

我稍微修改了您的 xslt 以获得所需的输出:

更新了 xslt:

   <?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <html>
      <body>
        <h2>My CD Collection</h2>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th>Title</th>
            <th>Artist</th>
            <th>Company</th>
          </tr>
          <xsl:apply-templates/>
        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="catalog/cd">
    <tr>
      <xsl:apply-templates select="title|artist|company"/>
    </tr>
  </xsl:template>


  <xsl:template match="title|artist|company">
    <xsl:choose>
      <xsl:when test="name()='company' and not(preceding-sibling::company)">
        <td>
          <xsl:value-of select="."/>
          <xsl:if test="following-sibling::company">
            <xsl:text>;</xsl:text>
            <xsl:for-each select="following-sibling::company">
              <xsl:value-of select="."/>
              <xsl:if test="position()!=last()">
                <xsl:text>;</xsl:text>
              </xsl:if>
            </xsl:for-each>
          </xsl:if>
        </td>
      </xsl:when>
      <xsl:when test="name()='company' and preceding-sibling::company"/>
      <xsl:otherwise>
        <td>
          <xsl:value-of select="."/>
        </td>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

输出:

  <html>
   <body>
      <h2>My CD Collection</h2>
      <table border="1">
         <tr bgcolor="#9acd32">
            <th>Title</th>
            <th>Artist</th>
            <th>Company</th>
         </tr>

         <tr>
            <td>Empire Burlesque</td>
            <td>Bob Dylan</td>
            <td>Columbia;ABC</td>
         </tr>

         <tr>
            <td>Hide your heart</td>
            <td>Bonnie Tyler</td>
            <td>CBS Records;ABC</td>
         </tr>

         <tr>
            <td>Greatest Hits</td>
            <td>Dolly Parton</td>
            <td>RCA</td>
         </tr>

      </table>
   </body>
</html>

对于 CSV 生成 XSLT,您可以访问http://stackoverflow.com/questions/16524580/xslt-to-convert-the-nested-elements-with-comma-seperated/16534999#16534999

于 2013-05-14T06:31:38.277 回答