如何在XML XSLT中的HTML ul中显示具有相同类型属性的Element?

时间:2017-12-28 09:12:15

标签: html xml xslt

我有带有books属性的Xml文件,它有一个type属性,我想在UL LI html中显示类型和所有相同类型的元素,如下所示:

  1. 的Type1
    • BOOK1
    • 第二册
  2. 第二类型
    • BOOK3
    • book4
  3. 这是我的xml代码:
  4. Assigning (instead of defining) a __getitem__ magic method breaks indexing 和我的xslt: Xml file in this link

      

    任何帮助我将不胜感激?

1 个答案:

答案 0 :(得分:0)

这是grouping的情况(正如@Martin Honnen正确指出的那样),并且由于您使用的是XSLT 1.0,因此需要定义<xsl:key>然后用于分组。

由于要在<titre>上进行分组,密钥将被定义为

<xsl:key name="keyTitre" match="livre" use="titre" />

接下来,我们遍历使用密钥分组的所有<livre>元素。

<xsl:for-each select="livre[generate-id() = generate-id(key('keyTitre', titre)[1])]">

最后,分组键的嵌套循环。

<xsl:for-each select="key('keyTitre', titre)">

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" />
    <xsl:strip-space elements="*" />

    <xsl:key name="keyTitre" match="livre" use="titre" />

    <xsl:template match="bibliotheque">
        <html>
            <body>
                <xsl:for-each select="livre[generate-id() = generate-id(key('keyTitre', titre)[1])]">
                    <ul>
                        <xsl:value-of select="titre" />
                        <xsl:for-each select="key('keyTitre', titre)">
                            <li>
                                <xsl:value-of select="concat(auteur/nom, ' ', auteur/prenom)" />
                            </li>
                        </xsl:for-each>
                    </ul>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

在输入XML上运行上面的XSLT会产生以下结果。由于输入XML为<titre>提供了3个不同的值,因此输出中有3个<ul>元素。

<html>
    <body>
        <ul>
            t1
            <li>n1 p1</li>
        </ul>
        <ul>
            t2
            <li>n2 p2</li>
        </ul>
        <ul>
            t3
            <li>n3 p3</li>
        </ul>
    </body>
</html>