使用XSLT转换XML文件(组合多个模板)

使用XSLT转换XML文件(组合多个模板),xml,templates,xslt,Xml,Templates,Xslt,我在这个问题上陷入了一段时间。我有一个示例XML文件,如下所示: <Records> <Record><Id>1</Id><Name>table_id</Name><Attribute></Attribute><Value>1</Value></Record> <Record><Id>1</Id><Name>sco

我在这个问题上陷入了一段时间。我有一个示例XML文件,如下所示:

<Records>
 <Record><Id>1</Id><Name>table_id</Name><Attribute></Attribute><Value>1</Value></Record>
 <Record><Id>1</Id><Name>score</Name><Attribute></Attribute><Value>2.1</Value></Record>
 <Record><Id>1</Id><Name>custom4</Name><Attribute>name</Attribute><Value>Custom411</Value></Record>
 <Record><Id>1</Id><Name>custom4</Name><Attribute>name</Attribute><Value>Custom412</Value></Record>
 <Record><Id>2</Id><Name>table_id</Name><Attribute></Attribute><Value>2</Value></Record>
 <Record><Id>2</Id><Name>title</Name><Attribute></Attribute><Value>Title 2</Value></Record>
</Records>

1表1
1核心2.1
1客户名称4客户411
1客户4姓名客户412
2表格2
标题2
我想使用以下格式的XSLT将所有ID和行合并到另一个XML文件中:

<RECORDS>
 <RECORD>
  <ITEM name="table_id" value="1"/>
  <ITEM name="score" value="2.1"/>
  <LIST name="custom4">
   <LIST_ITEM value="custom411"/>
   <LIST_ITEM value="custom412"/>
  </LIST>
 </RECORD>
 <RECORD>
  <ITEM name="table_id" value="2"/>
  <ITEM name="title" value="Title 2"/>
 </RECORD>
</RECORDS


有谁能从这里为我指点迷津或建议一条替代路线吗?

这里有一个简短但完整的XSLT 2.0样式表:

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

<xsl:output method="xml" indent="yes"/>

<xsl:template match="Records">
  <RECORDS>
    <xsl:for-each-group select="Record" group-by="Id">
      <RECORD>
        <ITEM name="table_id" value="{current-grouping-key()}"/>
        <xsl:for-each-group select="current-group()[not(Name = 'table_id')]" group-by="Name">
          <xsl:choose>
            <xsl:when test="current-group()[2]">
              <LIST name="{current-grouping-key()}">
                <xsl:for-each select="current-group()">
                  <LIST_ITEM value="{Value}"/>
                </xsl:for-each>
              </LIST>
            </xsl:when>
            <xsl:otherwise>
              <ITEM name="{Name}" value="{Value}"/>
            </xsl:otherwise>
          </xsl:choose>
         </xsl:for-each-group>
     </RECORD>
   </xsl:for-each-group>
 </RECORDS>
</xsl:template>

</xsl:stylesheet>

它使用Saxon 9转换输入

<Records>
  <Record>
    <Id>1</Id>
    <Name>table_id</Name>
    <Attribute></Attribute>
    <Value>1</Value>
  </Record>
  <Record>
    <Id>1</Id>
    <Name>score</Name>
    <Attribute></Attribute>
    <Value>2.1</Value>
  </Record>
  <Record>
    <Id>1</Id>
    <Name>custom4</Name>
    <Attribute>name</Attribute>
    <Value>Custom411</Value>
  </Record>
  <Record>
    <Id>1</Id>
    <Name>custom4</Name>
    <Attribute>name</Attribute>
    <Value>Custom412</Value>
  </Record>
  <Record>
    <Id>2</Id>
    <Name>table_id</Name>
    <Attribute></Attribute>
    <Value>2</Value>
  </Record>
  <Record>
    <Id>2</Id>
    <Name>title</Name>
    <Attribute></Attribute>
    <Value>Title 2</Value>
  </Record>
</Records>

1.
表号
1.
1.
分数
2.1
1.
习惯4
名称
海关411
1.
习惯4
名称
海关412
2.
表号
2.
2.
标题
标题2
结果如下:

<RECORDS>
   <RECORD>
      <ITEM name="table_id" value="1"/>
      <ITEM name="score" value="2.1"/>
      <LIST name="custom4">
         <LIST_ITEM value="Custom411"/>
         <LIST_ITEM value="Custom412"/>
      </LIST>
   </RECORD>
   <RECORD>
      <ITEM name="table_id" value="2"/>
      <ITEM name="title" value="Title 2"/>
   </RECORD>
</RECORDS>

非常感谢,解决方案非常优雅。我完全在另一条轨道上!
<RECORDS>
   <RECORD>
      <ITEM name="table_id" value="1"/>
      <ITEM name="score" value="2.1"/>
      <LIST name="custom4">
         <LIST_ITEM value="Custom411"/>
         <LIST_ITEM value="Custom412"/>
      </LIST>
   </RECORD>
   <RECORD>
      <ITEM name="table_id" value="2"/>
      <ITEM name="title" value="Title 2"/>
   </RECORD>
</RECORDS>