我有一个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)土豆。这里还有一些文字。
任何帮助都非常感激。
问候。
一个。
答案 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
来保存重复相同代码的两种情况。