1

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

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)土豆。这里还有一些文字。

任何帮助都非常感谢。

问候。

一个。

4

2 回答 2

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 编号列表。通过 CSS输出<ol><li>设置它们的样式,而不是在输出中硬编码列表编号。

于 2013-10-09T16:07:15.283 回答
1

您的问题是,这position()对您当前正在遍历的节点列表非常敏感。代替

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

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

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

对于“坏”案例也是如此。

正如Tomalak 建议的那样,您可以通过将其移动到单独的template并使用apply-templates而不是for-each.

于 2013-10-09T16:07:38.443 回答