使用 XSLT1.0 对具有子属性的 XML 进行分组



我现在是XSLT,我需要对子项的值进行一些分组。我有对象,可以有多个属性,其中一个(id=11)在我需要用作分组元素。每个对象可以具有的属性数量各不相同,但它们都具有共同的道具。

输入:

<object id=1>
 <properties>
    <prop id=10>Name of object 1</prop>
    <prop id=11>Group 1</prop>
    <prop id=xy>Whatever properties this object has</prop>
 </properties>
</object>
<object id=2>
 <properties>
    <prop id=10>Name of object 2</prop>
    <prop id=11>Group 2</prop>
 </properties>
</object>
<object id=3>
 <properties>
    <prop id=10>Name of object 3</prop>
    <prop id=11>Group 1</prop>
 </properties>
</object>
<object id=4>
 <properties>
    <prop id=10>Name of object 4</prop>
    <prop id=11>Group 3</prop>
 </properties>
</object>

期望输出:

<group name='Group 1'>
  <object id=1>
    <prop id=10>Name of object 1</prop>
    <prop id=11>Group 1</prop>
    <prop id=xy>Whatever properties this object has</prop>
  </object>
<object id=3>
 <properties>
    <prop id=10>Name of object 3</prop>
    <prop id=11>Group 1</prop>
 </properties>
</object>
</group>
<group name='Group 2'>
  <object id=2>
   <properties>
    <prop id=10>Name of object 2</prop>
    <prop id=11>Group 2</prop>
   </properties>
  </object>
</group>
<group name='Group 3'>
  <object id=4>
   <properties>
    <prop id=10>Name of object 4</prop>
    <prop id=11>Group 3</prop>
   </properties>
  </object>
</group>

这个想法是将项目按 id 为 11 的 prop 值分组。

找到了多个不同的代码示例,但没有一个有这种特定情况,我无法修改它们以满足我的需要。

我的xsl版本与Michael Vehrs基本相同,因为它也使用Muenchian方法,但我想我不妨发布它以显示一个微妙的替代方案。在这里,我使用的是应用模板而不是每个/调用模板。 就性能而言,它们之间可能没有任何区别,但就我个人而言,我更喜欢尽可能使用应用模板,因为它通常允许更大的灵活性。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no" encoding="utf-8"/>
<xsl:key name="groups" match="prop[@id='11']" use="text()"/>
<xsl:template match="/">
    <xsl:apply-templates select="//prop[generate-id()=generate-id(key('groups', text())[1])]"/>
</xsl:template>
<xsl:template match="prop">
    <group name="{text()}">
        <xsl:copy-of select="//object[properties/prop[@id='11']=current()/text()]"/>
    </group>
</xsl:template>
</xsl:stylesheet>

这是Muenchian方法的基本应用(例如,这里对此进行了解释):

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="prop" match="//prop[@id='11']/text()" use="." />
<xsl:template match="/">
  <xsl:for-each select="//prop[@id='11']/text()[generate-id()
                        = generate-id(key('prop',.)[1])]">
    <xsl:call-template name="group">
      <xsl:with-param name="groupname" select="." />
    </xsl:call-template>
  </xsl:for-each>
</xsl:template>
<xsl:template name="group">
  <xsl:param name="groupname" />
  <group><xsl:attribute name="name"><xsl:value-of select='$groupname'/></xsl:attribute>
  <xsl:for-each select="//object[.//prop[@id='11'][text()=$groupname]]" >
    <xsl:copy-of select="." />
  </xsl:for-each>
  </group>
</xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新