【问题标题】:XSL for-each iteration每次迭代的 XSL
【发布时间】:2013-01-19 14:03:51
【问题描述】:

我有两个 for-each 语句在迭代,我希望输出在表格中采用垂直格式而不是水平格式。

目前它输出:

a b c
1 2 3

我希望它输出:

a 1
b 2
c 3

有人可以帮忙吗?这是 XSL:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" indent="no"/>
    <xsl:key name="names" match="Niche" use="."/>
    <xsl:key name="niche" match="row" use="Niche"/>

        <xsl:template match="/">
            <table border="1">

                <xsl:for-each select="//Niche[generate-id() = generate-id(key('names',.)[1])]">
                <xsl:sort select="."/>

                    <td>
                    <xsl:value-of select="."/>
                    </td>
                </xsl:for-each>

                <td><tr></tr></td>

                <xsl:for-each select="//row[generate-id(.)=generate-id(key('niche', Niche)[1])]">
                <xsl:sort select="Niche"/>

                    <td>
                    <xsl:value-of select="count(key('niche', Niche))"/>
                    </td>
                </xsl:for-each>

            </table>

    </xsl:template>
</xsl:stylesheet>

示例 XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="sample.xsl" ?>
<root>
    <row>
        <Niche>a</Niche>
    </row>
    <row>
        <Niche>b</Niche>
    </row>
    <row>
        <Niche>b</Niche>
    </row>
    <row>
        <Niche>c</Niche>
    </row>
    <row>
        <Niche>c</Niche>
    </row>
    <row>
        <Niche>c</Niche>
    </row>
</root>

【问题讨论】:

  • 你能给我们看一个你开始的 XML 的例子吗,如果没有看到,很难解码样式表正在做什么。

标签: xml xslt foreach


【解决方案1】:

我很确定您需要做的就是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="no"/>
  <xsl:key name="niche" match="Niche" use="."/>

  <xsl:template match="/">
    <table border="1">

      <xsl:for-each select="//Niche[generate-id(.)=generate-id(key('niche', .)[1])]">
        <xsl:sort select="."/>
        <tr>
          <td>
            <xsl:value-of select="."/>
          </td>
          <td>
            <xsl:value-of select="count(key('niche', .))"/>
          </td>
        </tr>
      </xsl:for-each>

    </table>

  </xsl:template>
</xsl:stylesheet>

但请提供输入 XML 示例以便我们验证。

在样本输入上,这会产生:

<table border="1">
  <tr>
    <td>a</td>
    <td>1</td>
  </tr>
  <tr>
    <td>b</td>
    <td>2</td>
  </tr>
  <tr>
    <td>c</td>
    <td>3</td>
  </tr>
</table>

要改为从最高到最低的出现次数排序,您可以替换此行:

<xsl:sort select="."/>

用这个:

<xsl:sort select="count(key('niche', .))" order="descending" data-type="number"/>

【讨论】:

  • 更新了我的答案。请看文末评论。
  • 我没有修改原始的完整 XSLT。请在答案末尾查看我的评论,指出用另一行替换。
  • 当我尝试它时它绝对有效。我得到这个输出:&lt;table border="1"&gt;&lt;tr&gt;&lt;td&gt;c&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; 在 XSLFiddle.net 上尝试时结果相同。
  • 您能否发布一小部分,并将敏感值替换为样本值?它至少与您的样本结构相同,还是也不同?
  • 我明白了。听起来问题在于它是按字母排序而不是数字排序。您可以将data-type="number" 添加到&lt;xsl:sort&gt; 元素吗?我以为 XSLT 会根据公式结果的数据类型进行排序,但看起来默认是“文本”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 2012-10-08
  • 1970-01-01
  • 2011-05-04
相关资源
最近更新 更多