Xml 基于子ID值的XSLT分组依据

Xml 基于子ID值的XSLT分组依据,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我想转换一个具有多个header、detail和moretail节点的xml。每个节点都包含键“ID”以将它们连接在一起。 这看起来很简单,但对我来说不起作用 从以下xml开始: <?xml version="1.0" encoding="UTF-8"?> <File> <Header> <Id>1</Id> <Other>How</Other> </Head

我想转换一个具有多个header、detail和moretail节点的xml。每个节点都包含键“ID”以将它们连接在一起。
这看起来很简单,但对我来说不起作用

从以下xml开始:

<?xml version="1.0" encoding="UTF-8"?>
<File>
    <Header>
        <Id>1</Id>
        <Other>How</Other>
    </Header>
    <Detail>
        <Id>1</Id>
        <Other>to</Other>
    </Detail>
    <MoreDetails>
        <Id>1</Id>
        <Other>group</Other>
    </MoreDetails>
    <Header>
        <Id>2</Id>
        <Other>How</Other>
    </Header>
    <Detail>
        <Id>2</Id>
        <Other>to</Other>
    </Detail>
    <MoreDetails>
        <Id>2</Id>
        <Other>group</Other>
    </MoreDetails>
    <MoreDetails>
        <Id>2</Id>
        <Other>may have multiples</Other>
    </MoreDetails>
</File>

1.
怎么
1.
到
1.
组
2.
怎么
2.
到
2.
组
2.
可能有倍数
使用Group1、Group2等或groupvalue=1、groupvalue=2等生成如下内容

<?xml version="1.0" encoding="UTF-8"?>
<File>
    <Group value="1">
        <Header>
            <Id>1</Id>
            <Other>How</Other>
        </Header>
        <Detail>
            <Id>1</Id>
            <Other>to</Other>
        </Detail>
        <MoreDetails>
            <Id>1</Id>
            <Other>group</Other>
        </MoreDetails>
    </Group>
    <Group value="2">
        <Header>
            <Id>2</Id>
            <Other>How</Other>
        </Header>
        <Detail>
            <Id>2</Id>
            <Other>to</Other>
        </Detail>
        <MoreDetails>
            <Id>2</Id>
            <Other>group</Other>
        </MoreDetails>
        <MoreDetails>
            <Id>2</Id>
            <Other>with multiple child</Other>
        </MoreDetails>
    </Group>
</File>

1.
怎么
1.
到
1.
组
2.
怎么
2.
到
2.
组
2.
有多个孩子
我是这样开始的

 <xsl:template match="/File">

        <xsl:for-each-group select="./child::*" group-by="Id">
            <xsl:variable name="ID" select="Id"/>
            <xsl:value-of select="current-grouping-key()"/>

和使用变量和键名的变体,但我无法按指定输出

欢迎提出任何意见。 提前谢谢
-ac

您需要使用
current-group()
访问组中的节点

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs"
  version="2.0">

  <xsl:output indent="yes"/>

  <xsl:template match="/File">
    <File>
      <xsl:for-each-group select="./child::*" group-by="Id">
        <Group value="{Id}">
          <xsl:copy-of select="current-group()"/>
        </Group>
      </xsl:for-each-group>
    </File>
  </xsl:template>
</xsl:stylesheet>

您需要使用
current-group()
访问组中的节点

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs"
  version="2.0">

  <xsl:output indent="yes"/>

  <xsl:template match="/File">
    <File>
      <xsl:for-each-group select="./child::*" group-by="Id">
        <Group value="{Id}">
          <xsl:copy-of select="current-group()"/>
        </Group>
      </xsl:for-each-group>
    </File>
  </xsl:template>
</xsl:stylesheet>


效果很好。我所拥有的最接近的节点是(下图),但最后一个节点的形式不正确。感谢您提供的完美解决方案。啊,无法发布我的xsl。。无论如何,你的更好。再次感谢。这很有效。我所拥有的最接近的节点是(下图),但最后一个节点的形式不正确。感谢您提供的完美解决方案。啊,无法发布我的xsl。。无论如何,你的更好。再次感谢。