首页 > 解决方案 > XSLT - 分组 XML 数据

问题描述

我试图通过将 2<element>个节点组合成一个来将 XML 转换为特定的 XML 格式<item>。然后重复格式 foreach <element>。如果没有日期来填充它们,我想要空白节点。示例将位于所需结果的最底部。注意最后三个节点是空的。

我的 XML

<feed version="2.4">
<list>
    <element>
        <field name="01">text1</field>
        <field name="02">text2</field>
        <field name="03">text3</field>
        <field name="04">text4</field>
    </element>
    <element>
        <field name="01">text5</field>
        <field name="02">text6</field>
        <field name="03">text7</field>
        <field name="04">text8</field>
    </element>
    <element>
        <field name="01">text9</field>
        <field name="02">text10</field>
        <field name="03">text11</field>
        <field name="04">text12</field>
    </element>
    <element>
        <field name="01">text13</field>
        <field name="02">text14</field>
        <field name="03">text15</field>
        <field name="04">text16</field>
    </element>
    <element>
        <field name="01">text17</field>
        <field name="02">text18</field>
        <field name="03">text19</field>
        <field name="04">text20</field>
    </element>
</list>

期望的结果

<item>
   <title1>text1</title1>
   <desc1>text2</desc1>
   <opt1>text3</opt1>
   <title2>text5</title2>
   <desc2>text6</desc2>
   <opt2>text7</opt2>
</item>
<item>
   <title1>text9</title1>
   <desc1>text10</desc1>
   <opt1>text11</opt1>
   <title2>text13</title2>
   <desc2>text14</desc2>
   <opt2>text15</opt2>
</item>
<item>
   <title1>text17</title1>
   <desc1>text18</desc1>
   <opt1>text19</opt1>
   <title2></title2>
   <desc2></desc2>
   <opt2></opt2>
</item>

我正在使用的 XSLT。我很想获得 title2、desc2、opt2 的下一个值。

    <?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
      <xsl:for-each select="feed/list/element">
        <xsl:if test="not(number()=0) and position() mod 2 = 0">
           <Item>
               <title1><xsl:value-of select="field[@name='01']"/></title1>
               <desc1><xsl:value-of select="field[@name='02']"/></desc1>
               <opt1><xsl:value-of select="field[@name='03']"/></opt1>
               <title2><xsl:value-of select="field[@name='01']"/></title2>
               <desc2><xsl:value-of select="field[@name='02']"/></desc2>
               <opt2><xsl:value-of select="field[@name='03']"/></opt2>
       </Item>
        </xsl:if>
      </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

标签: xmlxsltgrouping

解决方案


怎么样:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/feed">
    <output>
        <xsl:for-each select="list/element[position() mod 2 = 1]">
            <item>
                <title1>
                    <xsl:value-of select="field[@name='01']"/>              
                </title1>
                <desc1>
                    <xsl:value-of select="field[@name='02']"/>              
                </desc1>
                <opt1>
                    <xsl:value-of select="field[@name='03']"/>              
                </opt1>
                <xsl:variable name="next" select="following-sibling::element[1]" />
                <title2>
                    <xsl:value-of select="$next/field[@name='01']"/>                
                </title2>
                <desc2>
                    <xsl:value-of select="$next/field[@name='02']"/>                
                </desc2>
                <opt2>
                    <xsl:value-of select="$next/field[@name='03']"/>                
                </opt2>
            </item>
        </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

推荐阅读