使用XSLT打印计数

时间:2009-10-08 00:45:52

标签: xml xslt xpath

我有一个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

来完成

3 个答案:

答案 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()未关闭。

另请注意,主模板现在与文档元素匹配,而不是根节点。