使用XSLT转换XML文件(组合多个模板)
我在这个问题上陷入了一段时间。我有一个示例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
<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>