【问题标题】:How to do a for-each-group in XSLT 1.0 without keys/Muenchian grouping如何在没有键/Muenchian 分组的 XSLT 1.0 中进行 for-each-group
【发布时间】:2016-06-28 21:25:53
【问题描述】:

我目前正在使用 XSLT 并尝试通过属性的子字符串对节点进行分组。唯一的问题是我在无法使用 xsl:key 的环境中工作。我想知道对诸如以下内容进行分组的最佳方法:

<RESULTS> <RESULT ID="Result:1-1" Value="32" /> <RESULT ID="Result:1-2" Value="3225" /> <RESULT ID="Result:1-3" Value="372" /> <RESULT ID="Result:1-4" Value="64732" /> <RESULT ID="Test:2-1" Value="6362" /> <RESULT ID="Test:2-2" Value="352" /> <RESULT ID="Test:2-3" Value="325" /> <RESULT ID="Result:3-1" Value="3243" /> <RESULT ID="Result:3-2" Value="2332" /> <RESULT ID="Result:3-3" Value="342" /> <RESULT ID="Result:3-4" Value="2134" /> </RESULTS>

这样它就可以在有一个表格的地方进行格式化,该表格按 ID 中的最后一位数字对结果进行分组并显示它们的值。例如,它将 Result:1-1、Test:2-1 和 Result:3-1 分组到第一个表中,并在其下方列出它们的值。

某种预期结果是:

| Table 1 |
|---------|
| 32      |
| 6362    |
| 3243    |

| Table 2 |
|---------|
| 3225    |
| 352     |
| 2332    |

| Table 3 |
|---------|
| 372     |
| 325     |
| 342     |

| Table 4 |
|---------|
| 64732   |
| 2134    |

任何关于某些分组使用方法或某些功能的建议将不胜感激! 感谢您的阅读和您提供的任何帮助!

【问题讨论】:

  • "唯一的问题是我在一个不能使用 xsl:key 的环境中工作。" 这个环境是什么? xsl:key 是 XSLT 语言的一个组成部分。如果您不能使用它,那么您就没有使用 XSLT - 我们怎么知道还有什么在您的环境中不起作用?
  • 这是我设置的一个非常特殊的环境,它读取 XSLT 的部分内容,通过将信息插入模板来转换信息。密钥要求它超出模板的范围,但我不能这样做。我没有意识到您必须使用语言中的每个预定义元素才能有资格使用它,抱歉。
  • "我没有意识到您必须使用语言中的每个预定义元素才能有资格使用它" w3.org/TR/xslt/#conformance
  • 我了解到您认为处理器应该能够处理xsl:key;然而,即使它不能,其他逻辑仍然符合 XSLT 的工作方式,所以我觉得我正在使用 XSLT。

标签: xml xslt xslt-1.0


【解决方案1】:

Muenchian 分组的替代方法在解释它的同一 article 中进行了描述;它也被标记为“非常低效”。

以下样式表:

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

<xsl:template match="/RESULTS">
    <html>
        <xsl:for-each select="RESULT">
            <xsl:variable name="key" select="substring(@ID, string-length(@ID))" />
            <xsl:if test="not(preceding-sibling::RESULT[substring(@ID, string-length(@ID))=$key])">
                <table border="1">
                    <tr>
                        <th>
                            <xsl:text>Table </xsl:text>
                            <xsl:value-of select="$key"/>
                        </th>
                    </tr>
                    <xsl:for-each select="../RESULT[substring(@ID, string-length(@ID))=$key]">
                        <tr>
                            <td>
                                <xsl:value-of select="@Value"/>
                            </td>
                        </tr>
                    </xsl:for-each>
                </table>
            </xsl:if>
        </xsl:for-each>
    </html>
</xsl:template>

</xsl:stylesheet>

当应用于您的示例输入时,将返回(渲染):

请注意,这与您发布的结果不同 - 但我相信它是正确的。

【讨论】:

  • 谢谢,是的,我的“结果”有点混乱,我现在将对其进行编辑以修复它。我知道它效率低下,但我打算暂时让它发挥作用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多