使用XSLT 1.0对剩余节点进行分组和移动

时间:2017-06-29 07:14:52

标签: xslt xslt-1.0

我有以下xml,

<?xml version="1.0" encoding="UTF-8"?>
<response>
   <case>
      <CMEDIA>Phone</CMEDIA>
   </case>
   <results>
      <row>
         <IKEY>TestKey1</IKEY>
         <OBJECTID>TestObject1</OBJECTID>
      </row>
      <row>
         <IKEY>TestKey1</IKEY>
         <OBJECTID>TestObject2</OBJECTID>
      </row>
      <row>
         <IKEY>TestKey1</IKEY>
         <OBJECTID>TestObject3</OBJECTID>
      </row>
      <row>
         <IKEY>TestKey4</IKEY>
         <OBJECTID>TestObject4</OBJECTID>
      </row>
   </results>
</response>

我的要求是对所有匹配的<IKEY>行进行分组,并将其移到一个<row>下,并移动新<OBJECTID>下的所有<row>个节点。

<?xml version="1.0" encoding="UTF-8"?>
<response>
   <case>
      <CMEDIA>Phone</CMEDIA>
   </case>
   <results>
      <row>
         <IKEY>TestKey1</IKEY>
         <OBJECTID>TestObject1</OBJECTID>
         <OBJECTID>TestObject2</OBJECTID>
         <OBJECTID>TestObject3</OBJECTID>
      </row>
      <row>
         <IKEY>TestKey4</IKEY>
         <OBJECTID>TestObject4</OBJECTID>
      </row>
   </results>
</response>

我正在尝试使用以下xsl进行基于<IKEY>的分组,但我无法将所有<OBJECTID>个节点移动到新的<row>(这里我只能使用XSLT 1.0 )。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml" indent="yes" />
   <xsl:key name="ikey" match="row" use="string(IKEY)" />
   <xsl:template match="results">
      <xsl:copy>
         <xsl:apply-templates select="row[generate-id() = generate-id(key('ikey', string(IKEY))[1])]" mode="ikey" />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="row" mode="ikey">
      <xsl:choose>
         <xsl:when test="IKEY">
            <row>
               <xsl:apply-templates select="IKEY|OBJECTID" />
            </row>
         </xsl:when>
      </xsl:choose>
   </xsl:template>
   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()" />
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

有人能告诉我这里缺少什么吗?

1 个答案:

答案 0 :(得分:1)

更改

           <xsl:apply-templates select="IKEY|OBJECTID" />

           <xsl:apply-templates select="IKEY|key('ikey', IKEY)/OBJECTID" />