我正在尝试从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>
它只返回第一项。所以我想要这个,但我认为我需要其他节点,我想要所有条目。如果你可以帮我解决这个问题会很棒。
答案 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