0

我被一个 xslt for-each-loop 困住了。

xml源文件为:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="party.xsl"?>
<party date="31.12.01">
<guest name="Albert">
    <drink>wine</drink>
    <drink>beer</drink>
    <status single="true" sober="false" />
</guest>
<guest name="Martina">
    <drink>apple juice</drink>
    <status single="true" sober="true" />
</guest>
<guest name="Zacharias">
    <drink>wine</drink>
    <status single="false" sober="false" />
</guest>
</party>

我想得到以下输出:

  • 阿尔伯特饮品:葡萄酒、啤酒、
  • 玛蒂娜饮品:苹果汁
  • 撒迦利亚饮品:酒,

因此我编写了以下 XSLT 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <html>
    <head></head>
    <body bgcolor="white">
        <xsl:for-each select="party/guest">
        <ul><li><b><xsl:value-of select="@name"/></b>
            <xsl:text> drinks: </xsl:text>
            <xsl:value-of select="drink"/>
            <xsl:text>, </xsl:text>
        </li></ul>
        </xsl:for-each>
    </body>
    </html>
</xsl:template>
</xsl:stylesheet>

使用上面的 XSLT 文件,我得到以下输出:

  • 阿尔伯特饮品:葡萄酒,
  • 玛蒂娜饮品:苹果汁,
  • 撒迦利亚饮品:酒,

我如何更改我的 XSLT 文件,以便从显示的客人中获取所有饮料?非常感谢你的支持!

4

1 回答 1

1

可以嵌套另一个级别的<xsl:for-each select="drink">.

不过,我建议避免<xsl:for-each>。此外,不要将所有内容都塞进一个全能模板中。

<xsl:template match="/">
  <html>
    <head></head>
    <body bgcolor="white">
      <xsl:apply-templates select="party" />
    </body>
  </html>
</xsl:template>

<xsl:template match="party">
  <ul>
    <xsl:apply-templates select="guest" />
  </ul>
</xsl:template>

<xsl:template match="guest">
  <li>
    <xsl:value-of select="concat(@name, ' drinks: ')" />
    <xsl:apply-templates select="drink" />
  </li>
</xsl:template>

<xsl:template match="drink">
  <xsl:value-of select="." />
  <xsl:if test="position() &lt; last()">, </xsl:if>
</xsl:template>
于 2013-10-23T11:56:08.617 回答