代码之家  ›  专栏  ›  技术社区  ›  ACesario

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

  •  0
  • ACesario  · 技术社区  · 9 年前

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

    <?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>
    

    <?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()"/>
    

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

    任何想法都非常受欢迎。 提前感谢 -空调

    1 回复  |  直到 9 年前
        1
  •  3
  •   Thomas W    9 年前

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