加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

通过Xsl中的子项的值来分组xml节点

发布时间:2020-12-16 07:53:19 所属栏目:百科 来源:网络整理
导读:rootelementid1/idgroupfirst/group/elementelementid2/idgroupsecond/group/elementelementid3/idgroupfirst/group/element...root 我如何按xslt 1.0中的组名分组我的元素. 输出: rootgroup name="first" element id1/id groupfirst/group /element elemen
<root>
<element>
<id>1</id>
<group>first</group>
</element>

<element>
<id>2</id>
<group>second</group>
</element>


<element>
<id>3</id>
<group>first</group>
</element>
...
<root>

我如何按xslt 1.0中的组名分组我的元素.
输出:

<root>
<group name="first">
 <element>
    <id>1</id>
    <group>first</group>
 </element>
 <element>
    <id>3</id>
    <group>first</group>
 </element>
</group>
<group name="second">
 <element>
    <id>2</id>
    <group>second</group>
    </element>
</group>
</root>

有任何想法吗?

这是Muenchian Grouping的工作.您将在StackOverflow中的XSLT标签中提供许多示例.

首先,您需要定义一个键来帮助您分组

<xsl:key name="groups" match="group" use="."/>

这将查找给定组名称的组元素.

接下来,您需要匹配每个distince组名称的所有出现的第一个实例.这是用这个可怕的陈述完成的

<xsl:apply-templates select="element/group[generate-id() = generate-id(key('groups',.)[1])]"/>

即匹配组元素,恰好是我们的密钥中该元素的第一次出现.

当您匹配不同的组节点时,您可以循环使用相同名称的所有其他组节点(其中$currentGroup是保存当前组名称的变量)

<xsl:for-each select="key('groups',$currentGroup)">

总而言之,

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:key name="groups" match="group" use="."/>

   <xsl:template match="/root">
      <root>
         <xsl:apply-templates select="element/group[generate-id() = generate-id(key('groups',.)[1])]"/>
      </root>
   </xsl:template>

   <xsl:template match="group">
      <xsl:variable name="currentGroup" select="."/>
      <group>
         <xsl:attribute name="name">
            <xsl:value-of select="$currentGroup"/>
         </xsl:attribute>
         <xsl:for-each select="key('groups',$currentGroup)">
            <element>
               <id>
                  <xsl:value-of select="../id"/>
               </id>
               <name>
                  <xsl:value-of select="$currentGroup"/>
               </name>
            </element>
         </xsl:for-each>
      </group>
   </xsl:template>

</xsl:stylesheet>

将其应用于您的示例XML,具有以下结果

<root>
   <group name="first">
      <element>
         <id>1</id>
         <name>first</name>
      </element>
      <element>
         <id>3</id>
         <name>first</name>
      </element>
   </group>
   <group name="seccond">
      <element>
         <id>2</id>
         <name>seccond</name>
      </element>
   </group>
</root>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读