【问题标题】:How do I sort a list of XML items into rows for an HTML table?如何将 XML 项目列表排序到 HTML 表的行中?
【发布时间】:2017-07-02 20:42:57
【问题描述】:

我有以下 XML:

<items>
  <item x="1" y="3"/>
  <item x="2" y="4"/>
  <item x="3" y="4"/>
  <item x="4" y="2"/>
  <item x="5" y="1"/>
</items>

我想最终将它们放入 HTML 表格中(xy 是该表格中单元格的坐标),并且为了更容易将这些项目放入行中,如下所示:

<items>
  <row y="1">
    <item x="1" y="1"/>
  </row>
  <row y="2">
    <item x="2" y="2"/>
  </row>
  <row y="3">
    <item x="5" y="3"/>
  </row>
  <row y="4">
    <item x="3" y="4"/>
    <item x="4" y="4"/>
  </row>
</items>

但我能想出的唯一转换不仅不起作用,而且不允许我用行号注释行。

<xsl:template match="/items">
  <items>
    <row>
      <xsl:for-each select="item">
        <xsl:sort select="@y"/>
        <xsl:sort select="@x"/>

        <xsl:if test="preceding-sibling::item[1]/@y != @y">
          <xsl:text>"</row>"</xsl:text>
          <xsl:text>"<row>"</xsl:text>
        </xsl:if>
        <xsl:copy-of select="."/>
      </xsl:for-each>
    </row>  
  </items>
</xsl:template>

我怎样才能做到这一点?

【问题讨论】:

  • 啊抱歉,XSLT 1.0。我会添加那个标签。

标签: xml xslt xslt-1.0


【解决方案1】:

您发布的 XSLT 无效 - 适当的处理器不会让您以这样的方式开始和结束标签,从而可能最终成为无效的 XML。

您需要对这些进行分组 - 如果您使用 XSLT 1.0,则可以像这样使用 Muenchian 分组,尽管我不太确定如何根据您的输入来理解您的预期输出:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" omit-xml-declaration="yes" indent="yes" />
  <xsl:key name="items-by-y" match="item" use="@y" />
  <xsl:template match="/items">
    <items>
      <xsl:for-each select="item[count(. | key('items-by-y', @y)[1]) =1]">
        <xsl:sort select="@y" />
        <xsl:sort select="@x" />
        <row y="{@y}">
          <xsl:for-each select="key('items-by-y', @y)">
            <xsl:copy-of select="." />
          </xsl:for-each>
        </row>
      </xsl:for-each>
    </items>
  </xsl:template>
</xsl:stylesheet>

结果:

<items>
    <row y="1">
        <item x="5" y="1"/>
    </row>
    <row y="2">
        <item x="4" y="2"/>
    </row>
    <row y="3">
        <item x="1" y="3"/>
    </row>
    <row y="4">
        <item x="2" y="4"/>
        <item x="3" y="4"/>
    </row>
</items>

如果您使用的是 XSLT 2.0,则可以执行 &lt;xsl:for-each-group&gt; 之类的操作,有关详细信息,请参阅 How to use for each group in XSL

【讨论】:

  • 很酷,谢谢!每个项目中都有更多元素,但我将它们省略以仅包含最相关的信息。
  • 我不明白第一个 for-each 是如何工作的。您查找所有 y 元素,取第一个并计算结果 - 或当前元素(如果它是空的?)。你能解释一下吗?
  • 看看en.wikipedia.org/wiki/XSLT/Muenchian_grouping 或google Muenchian 分组。第一个基本上使用 key 来确保您只迭代不同的 y 元素。
猜你喜欢
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 2018-08-07
  • 2016-05-23
  • 1970-01-01
相关资源
最近更新 更多