XSLT - 拆分节点和组项目

XSLT - Split node and group items

我是 XSLT 的新手,正在挑战以下要求:

来源:

<item>
  <name>123-foo</name>
  <value>xxx</value>
</item>
<item>
  <name>123-bar</name>
  <value>yyy</value>
</item>
<item>
  <name>456-foo</name>
  <value>zzz</value>
</item>
<item>
  <name>456-bar</name>
  <value>aaa</value>
</item>

结果应该是这样的:

<item>
  <key>123</key>
  <control>foo</control>
  <value>xxx</value>
</item>
<item>
  <key>123</key>
  <control>bar</control>
  <value>yyy</value>
</item>
<item>
  <key>456</key>
  <control>foo</control>
  <value>zzz</value>
</item>
<item>
  <key>456</key>
  <control>bar</control>
  <value>aaa</value>
</item>

附加要求:应跳过列表的前两项。

在第二步中,这些项目应该按键分组。

<xsl:for-each-group select="*" group-by="key"> 
 <!-- do something with each grouped item -->
</xsl:for-each-group> 

我怎样才能做到这一点?我已经有一个名为 $data 的变量来获取每个源项的值。 示例:<xsl:value-of select="$data/123-foo"></xsl:value-of> 将输出“xxx”,但我不确定这是否有帮助。

使用group-by=“substring-before(., ‘-‘)”

您可以一步完成:

    <xsl:for-each-group select="item" group-by="substring-before(name, '-')"> 
        <group>
            <xsl:for-each select="current-group()"> 
                <item>
                    <key>
                        <xsl:value-of select="current-grouping-key()"/>
                    </key>
                    <control>
                        <xsl:value-of select="substring-after(name, '-')"/>
                    </control>
                    <xsl:copy-of select="value"/>
                </item>
            </xsl:for-each>
        </group>
    </xsl:for-each-group>

演示:https://xsltfiddle.liberty-development.net/gVAkJ5m

不确定你的意思:

The first two items of the list should be skipped.