我有一个XML文件,我正在尝试使用XSLT文件转换为XHTML。我想知道是否可以计算模板被调用的次数。这是我的XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" encoding="UTF-8" href="car.xslt" version="1.0"?>
<vehicle>
<car>
<make>Honda</make>
<color>blue</color>
</car>
<car>
<make>Saab</make>
<color>red</color>
</car>
</vehicle>
这是我的XSLT:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<table cellpadding="5" border="1">
<tr><td>number</td><td>make</td><td>color</td></tr>
<xsl:apply-templates/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="car">
<tr>
<td>#</td><td><xsl:value-of select="make"/></td><td><xsl:value-of select="color"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
我想在#的位置打印汽车的打印次数,所以它看起来像这样:
数字制作颜色 1 本田蓝 2 萨博红
而不是:
数字制作颜色 #本田蓝 #Saab red
有人有什么想法吗?我希望这可以通过xsl:value-of和XPath
来完成答案 0 :(得分:3)
替换
<强>#强>
使用
<xsl:value-of select="position()"/>
答案 1 :(得分:1)
您可以稍微重新排列这一点,以便不使用<xsl:apply-templates/>
,而是执行以下操作:
<tr><td>number</td><td>make</td><td>color</td></tr>
<xsl:for-each select="/vehicle/car">
<tr>
<td><xsl:value-of select="position()" /></td><td>...</td>
</tr>
</xsl:for-each>
在这种情况下,position()
函数将引用关联的for-each
循环的迭代编号。这可能会为您提供所需的信息。
答案 2 :(得分:1)
微小变化:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
>
<xsl:template match="/vehicle">
<html>
<body>
<table cellpadding="5" border="1">
<tr>
<td>number</td>
<td>make</td>
<td>color</td>
</tr>
<xsl:apply-templates select="car" />
</table>
</body>
</html>
</xsl:template>
<xsl:template match="car">
<tr>
<td><xsl:value-of select="position()" /></td>
<td><xsl:value-of select="make" /></td>
<td><xsl:value-of select="color" /></td>
</tr>
</xsl:template>
</xsl:stylesheet>
请注意select="car"
上的<xsl:apply-templates>
属性。它确保只计算<car>
个节点,因此position()
未关闭。
另请注意,主模板现在与文档元素匹配,而不是根节点。