【问题标题】:XSL sort items by conditionXSL 按条件对项目进行排序
【发布时间】:2013-10-22 12:24:36
【问题描述】:

我有以下 xml:

<main>
    <cat>
        <id>12</id>
        <name>Pizza-Tuno</name>
        <depends>
            <depend>
                <id>2</id>
                <name>Tuno</name>
                <type>Food</type>
            </depend>
            <depend>
                <id>122</id>
                <name>Knife</name>
                <type>Tool</type>
            </depend>
            <depend>
                <id>1123</id>
                <name>Water</name>
                <type>Food</type>
            </depend>
            <depend>
                <id>417</id>
                <name>Scissors</name>
                <type>Tool</type>
            </depend>
        </depends>
    </cat>
</main>

目前我有这个 xsl:

<html>
    <body>
        Foods:
        <ul>
            <xsl:apply-tempaltes match="main/cat" />
        </ul>

        Tools:
        <ul>
            <xsl:apply-tempaltes match="main/cat" />
        </ul>

    </body>

</html>

  <xsl:template match="main/cat">

        <li>

                <xsl:value-of select="name" />


        </li>

    </xsl:template>

我想要这个输出:

 <html>
        <body>
            Foods:
            <ul>
                <li>Tuno</li>
                        <li>Water<li/>


            </ul>

            Tools:
            <ul>
                <li>Knife</li>
                        <li>Scissors</li>
            </ul>

        </body>

    </html>

我怎样才能用 xsl 做到这一点?元素应该除以元素..

【问题讨论】:

  • 你所拥有的不是 XSLT。它充满了语义和语法错误。复制和粘贴您拥有的 XSLT 有多难? ://

标签: xml xslt xpath


【解决方案1】:

通常xsl:apply-templates 按所谓的文档顺序处理节点。要更改节点的顺序,您可以在 xsl:apply-templates 调用中包含 xsl:sort 指令。

<xsl:apply-templates select="...">
    <xsl:sort select="..."/>
</xsl:apply-templates>

请注意,默认情况下,排序是按 ASCII 顺序应用的。但是你可以告诉处理器你实际上想要按数字排序:

<xsl:sort select="..." data-type="number"/>

话虽如此,您的 XSLT 需要通过以下方式进行修改:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


    <xsl:template match="document-node()">
        <html>
            <body>
                Foods:
                <ul>
                    <xsl:apply-templates select="main/cat/depends/depend[type = 'Food']">
                        <xsl:sort select="id" data-type="number"/>
                    </xsl:apply-templates>
                </ul>

                Tools:
                <ul>
                    <xsl:apply-templates select="main/cat/depends/depend[type = 'Tool']">
                        <xsl:sort select="id" data-type="number"/>
                    </xsl:apply-templates>
                </ul>
            </body>
        </html>
    </xsl:template>


    <xsl:template match="depend">
        <li>
            <xsl:value-of select="name" />
        </li>
    </xsl:template>

</xsl:stylesheet>

【讨论】:

  • 使用document-node()/* 有优势吗?
  • 并非如此。这是一个偏好问题。我喜欢document-node()element()attribute()等函数,因为它们的明确性。例如,起初我并不清楚“*”简写是什么意思。对我来说它是“一切”,但它只代表元素。
  • 谢谢 serhiy.h。这正是我想要的!
  • 顺便说一句,我刚刚读到 data-type 属性在 XSLT 2.0 中被认为是过时的。可以(并且应该)根据输入的数据类型执行数字排序:&lt;xsl:sort select="xs:integer(...)"/&gt;
猜你喜欢
  • 2018-02-27
  • 2021-07-22
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多