XSLT 转换与同一级别下的重复节点

XSLT transform with repeating node under same level

我是 xslt 新手。我正在学习 xslt 并且在转换 xml 格式时遇到困难。 我有以下 xml 输入

```<Body>
    <Grp Name="Root">
      <Grp Name="Info">
        <Parm Name="parent_id" Val="Id_1" />
        <Grp Name="CurrenInfo">
          <Parm Name="current_id" Val="Id_1A" />
          <Grp Name="CurrentChildInfo">
            <Parm Name="Name" Val="State1" />
            <Parm Name="Value" Val="S1" />
          </Grp>
          <Grp Name="CurrentChildInfo">
            <Parm Name="Name" Val="State2" />
            <Parm Name="Value" Val="S2" />
          </Grp>
        </Grp>
        <Grp Name="CurrenInfo">
          <Parm Name="current_id" Val="Id_1B" />
          <Grp Name="CurrentChildInfo">
            <Parm Name="Name" Val="State3" />
            <Parm Name="Value" Val="S3" />
          </Grp>
        </Grp>
      </Grp>
    </Grp>
  </Body>`

我需要将其转换为以下格式.....

```<Info>
  <parent_id>Id_1</parent_id>
  <original_list>
    <list>
      <current_id>Id_1A</current_id>
      <Name>State1</Name>
      <Value>S1</Value>
     </list>
     <list>
      <current_id>Id_1A</current_id>
      <Name>State2</Name>
      <Value>S2</Value>
    </list>
    <list>
      <current_id>Id_1B</current_id>
      <Name>State3</Name>
      <Value>S3</Value>
    </list>
  </original_list>
<Info>```

以下是我当前的 xslt

```<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
  
  <xsl:template match="Body">
        <xsl:element name="Info">
          <xsl:for-each select="//Grp[@Name='Root']/Grp[@Name='Info']">
            <xsl:for-each select="Parm">
              <xsl:element name="parent_id">
                <xsl:value-of select="@Val"/>
              </xsl:element>
            </xsl:for-each>
              <xsl:for-each select="//Grp[@Name='CurrenInfo']">
                <xsl:element name="list">
                  <xsl:for-each select="Parm">
                    <xsl:element name="current_id">
                      <xsl:value-of select="@Val"/>
                    </xsl:element>
                  </xsl:for-each>
                    <xsl:for-each select="Grp[@Name='CurrentChildInfo']">
                        <xsl:for-each select="Parm">
                          <xsl:element name="{@Name}">
                            <xsl:value-of select="@Val"/>
                          </xsl:element>
                        </xsl:for-each>
                    </xsl:for-each>
                  </xsl:element>
              </xsl:for-each>
          </xsl:for-each>
        </xsl:element>
  </xsl:template>
</xsl:stylesheet>```

但是当我使用上面的 xslt 时,输出格式如下

```<Info>
  <parent_id>Id_1</parent_id>
  <list>
    <current_id>Id_1A</current_id>
    <Name>State1</Name>
    <Value>S1</Value>
    <Name>State2</Name>
    <Value>S2</Value>
  </list>
  <list>
    <current_id>Id_1B</current_id>
    <Name>State3</Name>
    <Value>S3</Value>
  </list>
</Info>```

需要帮助将 xslt 更正为 return 所需的格式 谢谢

只做一些小的修改,您可以使用以下样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    
    <xsl:template match="Body">
        <xsl:element name="Info">
            <xsl:for-each select="Grp[@Name='Root']/Grp[@Name='Info']">
                <xsl:for-each select="Parm">
                    <xsl:element name="parent_id">
                        <xsl:value-of select="@Val"/>
                    </xsl:element>
                </xsl:for-each>
                <original_list>
                    <xsl:for-each select=".//Grp[@Name='CurrentChildInfo']">
                        <xsl:element name="list">
                            <xsl:for-each select="../Parm">
                                <xsl:element name="current_id">
                                    <xsl:value-of select="@Val"/>
                                </xsl:element>
                            </xsl:for-each>
                            <xsl:for-each select="Parm">
                                <xsl:element name="{@Name}">
                                    <xsl:value-of select="@Val"/>
                                </xsl:element>
                            </xsl:for-each>
                        </xsl:element>
                    </xsl:for-each>
                </original_list>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

它的输出是

<Info>
   <parent_id>Id_1</parent_id>
   <original_list>
      <list>
         <current_id>Id_1A</current_id>
         <Name>State1</Name>
         <Value>S1</Value>
      </list>
      <list>
         <current_id>Id_1A</current_id>
         <Name>State2</Name>
         <Value>S2</Value>
      </list>
      <list>
         <current_id>Id_1B</current_id>
         <Name>State3</Name>
         <Value>S3</Value>
      </list>
   </original_list>
</Info>

我从第一个 xsl:for-each 中删除了 //,因为它似乎没有必要。但是如果你喜欢 select 所有 @Name='Root' children,最好使用 .//.