基于ID值child

时间:2016-12-04 03:07:32

标签: xml xslt xslt-2.0

我想用多个header,detail和moredetail节点转换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>

使用Group1,Group2等生成如下内容,或者Group value = 1,Group value = 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>

我从这样的事情开始,

 <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

1 个答案:

答案 0 :(得分:2)

您需要使用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>