Xslt XSL 1.0双分组

Xslt XSL 1.0双分组,xslt,xslt-1.0,xslt-grouping,Xslt,Xslt 1.0,Xslt Grouping,这是我的第一个问题 我想使用XSL 1.0转换此xml: <RESULTS> <RES> <GROUP>1</GROUP> <SUBGROUP>A</SUBGROUP> <NAME>Alice</NAME> </RES> <RES> <GROUP>1</GROUP> &

这是我的第一个问题

我想使用XSL 1.0转换此xml:

<RESULTS>
    <RES>
      <GROUP>1</GROUP>
      <SUBGROUP>A</SUBGROUP>
      <NAME>Alice</NAME>
    </RES>

    <RES>
      <GROUP>1</GROUP>
      <SUBGROUP>A</SUBGROUP>
      <NAME>Bart</NAME>
    </RES>

    <RES>
      <GROUP>1</GROUP>
      <SUBGROUP>B</SUBGROUP>
      <NAME>Keira</NAME>
    </RES>

    <RES>
      <GROUP>2</GROUP>
      <SUBGROUP>A</SUBGROUP>
      <NAME>Mike</NAME>
    </RES>

    <RES>
      <GROUP>2</GROUP>
      <SUBGROUP>B</SUBGROUP>
      <NAME>Peter</NAME>
    </RES>

    <RES>
      <GROUP>2</GROUP>
      <SUBGROUP>B</SUBGROUP>
      <NAME>Olaf</NAME>
    </RES>

</RESULTS>

1.
A.
爱丽丝
1.
A.
巴特
1.
B
凯拉
2.
A.
迈克
2.
B
彼得
2.
B
奥拉夫
为此:

    <h1> 1 </h1>
       <h2>A</h2>
         <p>Alice</p>
         <p>Bart</p>

       <h2>B</h2>
         <p>Keira</p>

    <h1> 2 </h1>
       <h2>A</h2>
         <p>Mike</p>

       <h2>B</h2>
         <p>Peter</p>
         <p>Olaf</p>
1
A.
爱丽丝

巴特

B 凯拉

2. A. 迈克

B 彼得

奥拉夫

我已经尝试使用Muenchian方法,但是这只允许我按组排序,并且我不能按子组对排序结果排序。请注意,每个组/子组只能查看一次标题

@斯珀伯格·麦奎因

我不想张贴一堵文字墙,但如果它可能有帮助,我会这样做:

这是我尝试过的解决方案之一:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="byGROUP" match="RESULTS/RES" use="GROUP" />
    <xsl:template match="RESULTS">
        <xsl:for-each select="RES[count(. | key('byGROUP', GROUP)[1]) = 1]">
            <xsl:sort select="GROUP" order="descending" />
            <h1>
                <xsl:value-of select="GROUP" />
            </h1>

            <xsl:for-each select="key('byGROUP', GROUP)">
                <xsl:sort select="SUBGROUP" order="descending" />
                <h2>
                    <xsl:value-of select="SUBGROUP" />
                </h2>

                <p>
                    <xsl:value-of select="NAME" />
                </p>

            </xsl:for-each>

        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>



我尝试使用前向同级来测试是否查看子组,但我发现不可能遍历节点,因此这可能不是一个好方法。

进行多个分组的典型方法是使用当前级别的值与所有父级值的串联作为键值:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" omit-xml-declaration="yes"/>
  <xsl:key name="byGROUP" match="RESULTS/RES" use="GROUP" />
  <xsl:key name="bySUBGROUP" match="RESULTS/RES"
           use="concat(GROUP, '+', SUBGROUP)" />  

  <xsl:template match="RESULTS">
    <xsl:apply-templates
      select="RES[count(. | key('byGROUP', GROUP)[1]) = 1]
                 /GROUP">
      <xsl:sort select="." order="ascending" />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="GROUP">
    <h1>
      <xsl:value-of select="." />
    </h1>
    <xsl:variable name="thisGroup" select="key('byGROUP', .)" />
    <xsl:apply-templates
      select="$thisGroup[count(. | 
                          key('bySUBGROUP', concat(GROUP, '+', SUBGROUP))[1])
                         = 1]
                        /SUBGROUP">
      <xsl:sort select="." order="ascending" />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="SUBGROUP">
    <h2>
      <xsl:value-of select="." />
    </h2>
    <xsl:apply-templates select="key('bySUBGROUP', concat(../GROUP, '+', .))"/>
  </xsl:template>

  <xsl:template match="RES">
    <p>
      <xsl:value-of select="NAME" />
    </p>
  </xsl:template>
</xsl:stylesheet>


在样例输入上运行时,将生成:

<h1>1</h1>
<h2>A</h2>
<p>Alice</p>
<p>Bart</p>
<h2>B</h2>
<p>Keira</p>
<h1>2</h1>
<h2>A</h2>
<p>Mike</p>
<h2>B</h2>
<p>Peter</p>
<p>Olaf</p>
1
A.
爱丽丝

巴特

B 凯拉

2. A. 迈克

B 彼得

奥拉夫


欢迎使用堆栈溢出!如果你展示了你所做的尝试以及它是如何出错的,这将更容易帮助你发现问题所在。谢谢你的反馈,我已经按照你的要求更新了问题。第一个答案就是这样!:)很少有测试证实它工作正常。对于像我这样的xsl初学者来说,这在一开始并不明显。谢谢