这是我在这里的第一个问题。
我想使用 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>
进入这个:
    <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>
我已经尝试过使用 Muenchian Method,但是这只允许我按 GROUP 排序,并且我无法按 SUBGROUP 对排序结果进行排序。请注意,每个组/子组我只能查看一次标题。
@CM Sperberg-麦昆
我不想贴一堵文字墙,但如果它可能有助于我这样做:
这是我尝试过的解决方案之一:
<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>
我尝试使用 preceiding-sibling 来测试是否查看 SUBGROUP 但我发现遍历节点是不可能的,所以这可能不是一个好方法。