<xsl:number>重置编号</xsl:number>

时间:2013-10-09 15:44:08

标签: xslt numbers

我有一个XML文件,其中列出了具有两种不同质量的项目,我需要创建一个HTML输出,列出两个类别中的项目,编号顺序以两者开头。我找不到解决方案。以下是我目前创建的文件:

XML

<?xml version="1.0" encoding="UTF-8"?>
<refrigerator>
<item>
<quality>Good</quality>
<item_name>eggs</item_name>
</item>
<item>
<quality>Good</quality>
<item_name>chess</item_name>
</item>
<item>
<quality>Good</quality>
<item_name>soda</item_name>
</item>
<item>
<quality>Bad</quality>
<item_name>chicken meat</item_name>
</item>
<item>
<quality>Bad</quality>
<item_name>spinach</item_name>
</item>
<item>
<quality>Bad</quality>
<item_name>potatoes</item_name>
</item>
</refrigerator>

XSL

<table width="100%" border="1">
<tr>
<td>
<strong>These are the good items in the refrigerator/strong>
<xsl:for-each select="refrigerator/item">
<xsl:if test="quality = 'Good'">
<strong><xsl:number format="a) " value="position()"/></strong>
<xsl:value-of select="item_name"/>
</xsl:if>
</xsl:for-each>

, <strong>and these are the bad ones/strong>
<xsl:for-each select="refrigerator/item">
<xsl:if test="quality = 'Bad'">
<strong><xsl:number format="a) " value="position()"/></strong>
<xsl:value-of select="item_name"/>
</xsl:if>
</xsl:for-each>


. Some more text over here.</td>
</tr>
</table>

HTML

这些是冰箱里的好东西:a)鸡蛋b)国际象棋c)苏打水,这些是坏的:d)鸡肉e)菠菜f)土豆。这里还有一些文字。

需要输出

这些是冰箱里的好东西:a)鸡蛋b)国际象棋c)苏打水,这些是坏的:a)鸡肉b)菠菜c)土豆。这里还有一些文字。

任何帮助都非常感激。

问候。

一个。

2 个答案:

答案 0 :(得分:1)

或者:正确使用<xsl:for-each>

<xsl:template match="refrigerator">
  <table width="100%" border="1">
    <tr>
      <td>
        <strong>These are the good items in the refrigerator</strong>

        <xsl:for-each select="item[quality = 'Good']">
          <strong><xsl:number format="a) " value="position()"/></strong>
          <xsl:value-of select="item_name" />
        </xsl:for-each>

        <xsl:text>, <xsl:text>
        <strong>and these are the bad ones</strong>

        <xsl:for-each select="item[quality = 'Bad']">
          <strong><xsl:number format="a) " value="position()"/></strong>
          <xsl:value-of select="item_name" />
        </xsl:for-each>

        <xsl:text>. Some more text over here.</xsl:text>
      </td>
    </tr>
  </table>
</xsl:template>

或者,不要重复自己,也不要使用<xsl:for-each>

<xsl:template match="refrigerator">
  <table width="100%" border="1">
    <tr>
      <td>
        <strong>These are the good items in the refrigerator</strong>

        <xsl:apply-templates select="item[quality = 'Good']" mode="numbered" />

        <xsl:text>, <xsl:text>
        <strong>and these are the bad ones</strong>

        <xsl:apply-templates select="item[quality = 'Bad']" mode="numbered" />

        <xsl:text>. Some more text over here.</xsl:text>
      </td>
    </tr>
  </table>
</xsl:template>

<xsl:template match="item" mode="numbered">
  <div>
    <strong><xsl:number format="a) " value="position()"/></strong>
    <xsl:value-of select="item_name" />
  </div>
</xsl:template>

或者,,这是更优选的,使用HTML编号列表。输出<ol><li>并通过CSS设置样式,而不是输出中的硬编码列表编号。

答案 1 :(得分:1)

您的问题是position()对您目前正在进行的节点列表敏感。而不是

<xsl:for-each select="refrigerator/item">
  <xsl:if test="quality = 'Good'">

将测试放入for-each选择表达式

<xsl:for-each select="refrigerator/item[quality = 'Good']">

并且类似于“坏”案例。

作为Tomalak suggests,您可以通过将其移至单独的template并使用apply-templates代替for-each来保存重复相同代码的两种情况。