具有相同节点名称时选择并合并XML数据

时间:2013-05-14 06:09:02

标签: xml

我正在尝试从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>

它只返回第一项。所以我想要这个,但我认为我需要其他节点,我想要所有条目。如果你可以帮我解决这个问题会很棒。

1 个答案:

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