我试图在我的文档中创建多个表。这是当前使用的XSLT代码:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2 align="center">UFC Fighter Roster</h2>
<table border="0" align="left" width="20%" >
<th>Heavyweight</th>
<tr bgcolor="#9acd32">
<th>Name</th>
<th>Rank</th>
</tr>
<xsl:for-each select="roster/cd">
<xsl:if test="weight=180">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="rank"/></td>
</tr>
</table>
</xsl:if>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我使用这张桌子以重量= 180拉动战斗机,如果我想在同一页面上生成一张桌子,代表重量= 170的战士,我该如何去做,因为每次我尝试使用相同的代码,但不同的重量数字,它不起作用?
以下是我正在使用的XML版本。
<?xml version="1.0" encoding="UTF-8"?>
<roster>
<cd>
<title>Cain Velasquez</title>
<rank>1st</rank>
<weight>180</weight>
</cd>
<cd>
<title>Fabricio Werdum</title>
<rank>2nd</rank>
<weight>180</weight>
</cd>
<cd>
<title>Junior Dos Santos</title>
<rank>3rd</rank>
<weight>180</weight>
</cd>
<cd>
<title>Travis Browne</title>
<rank>4th</rank>
<weight>180</weight>
</cd>
<cd>
<title>Antonio Silva</title>
<rank>5th</rank>
<weight>180</weight>
</cd>
<cd>
<title>Jon Jones</title>
<rank>1st</rank>
<weight>170</weight>
</cd>
<cd>
<title>Alexander Guftasson</title>
<rank>2nd</rank>
<weight>170</weight>
</cd>
<cd>
<title>Rashad Evans</title>
<rank>3rd</rank>
<weight>170</weight>
</cd>
<cd>
<title>Glover Teixiera</title>
<rank>4th</rank>
<weight>170</weight>
</cd>
<cd>
<title>Shogun Rua</title>
<rank>5th</rank>
<weight>170</weight>
</cd>
</catalog>
答案 0 :(得分:1)
如果我愿意的话,我正在使用这张桌子来拉动重量= 180的战士 在同一页面上制作一张表格,表示战士的表格 重量= 170我该怎么做呢
您应该使用键,而不是尝试使用xsl:if
执行此操作。
例如:
XSLT 1.0
xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="cd-by-weight" match="cd" use="weight" />
<xsl:template match="/">
<html>
<table>
<tr>
<th>Heavyweight</th>
</tr>
<tr>
<th>Name</th>
<th>Rank</th>
</tr>
<xsl:for-each select="key('cd-by-weight', 180)">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="rank"/></td>
</tr>
</xsl:for-each>
</table>
<br/>
<table>
<tr>
<th>Less Heavyweight</th>
</tr>
<tr>
<th>Name</th>
<th>Rank</th>
</tr>
<xsl:for-each select="key('cd-by-weight', 170)">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="rank"/></td>
</tr>
</xsl:for-each>
</table>
</html>
</xsl:template>
</xsl:stylesheet>
这假设源文档始终包含两个权重的战斗机。请注意,可以通过调用以权重作为参数的命名模板来消除代码重复。
答案 1 :(得分:0)
在XSL 2.0中
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2 align="center">UFC Fighter Roster</h2>
<xsl:for-each-group select="roster/cd" group-by="weight">
<table border="0" align="left" width="20%" >
<th>Heavyweight</th>
<tr bgcolor="#9acd32">
<th>Name</th>
<th>Rank</th>
</tr>
<xsl:for-each select="current-group()">
<tr>
<td><xsl:value-of select="title/node()"/></td>
<td><xsl:value-of select="rank/node()"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:for-each-group>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
如果您希望它是模块化的,您可以按照以下步骤进行操作:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<h2 align="center">UFC Fighter Roster</h2>
<xsl:call-template name="table">
<xsl:with-param name="title">Heavyweight</xsl:with-param>
<xsl:with-param name="w" select="180"/>
</xsl:call-template>
<xsl:call-template name="table">
<xsl:with-param name="title">weight (170)</xsl:with-param>
<xsl:with-param name="w" select="170"/>
</xsl:call-template>
</body>
</html>
</xsl:template>
<xsl:template name="table">
<xsl:param name="w"/>
<xsl:param name="title"/>
<table border="0" align="left" width="20%" >
<th><xsl:value-of select="$title"/></th>
<tr bgcolor="#9acd32">
<th>Name</th>
<th>Rank</th>
</tr>
<xsl:apply-templates select="/catalog/cd[weight=$w]"/>
</table>
</xsl:template>
<xsl:template match="cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="rank"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
对于XSLT2.0分组是一个很好的选择,如果你想要特定的值,那么使用current-group-key():
<xsl:for-each select="current-group()[current-grouping-key() = ('170','180')]">
<tr>
<td><xsl:value-of select="title/node()"/></td>
<td><xsl:value-of select="rank/node()"/></td>
</tr>
</xsl:for-each>
希望它会有所帮助
问候,
晏