如果属性的值相同,则XSL合并同级的值 [英] XSL combining values of siblings if values of an attribute is same

查看:75
本文介绍了如果属性的值相同,则XSL合并同级的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的XML的样子

<?xml version="1.0"?>
<Nodes>
<NodeA NodeAattr="123">

<NodeB NodeBattr="456"></NodeB>

  <NodeC>
     <NodeD NodeDAttr="ValueD">
        <NodeE Name="ValueABC"> "555" </NodeE >
        <NodeE Name="ValueABC"> "666" </NodeE>
     </NodeD>
  </NodeC>
</NodeA>
</Nodes>

如果NodeE的Name属性的值相同,请连接NodeE的值。
而且我的最终输出xml必须看起来像

If the values of the Name attribute of NodeE are same, concatenate the values of NodeE. And my final output xml has to look like

<NodeA NodeAattr="123">

<NodeB NodeBattr="456"></NodeB>

  <NodeC>
     <NodeD="ValueD">
        <NodeE Name="ValueABC"> "555" , "666" </NodeE >
     </NodeD>
  </NodeC>
</NodeA>

请向我提供xsl。我正在使用XSLT1.0

Please provide me with the xsl.. I am using XSLT1.0

推荐答案

应该这样做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:strip-space elements="*" />

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="NodeE">
    <xsl:copy>
      <xsl:apply-templates select="@* | text()" />
      <xsl:call-template name="NextSibling" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="NodeE[@Name = preceding-sibling::*[1][self::NodeE]/@Name]" />

  <xsl:template match="NodeE" mode="includeSib">
    <xsl:value-of select="concat(',', .)"/>
    <xsl:call-template name="NextSibling" />
  </xsl:template>

  <xsl:template name="NextSibling">
    <xsl:apply-templates
      select="following-sibling::*[1]
                                  [self::NodeE and @Name = current()/@Name]"
      mode="includeSib" />
  </xsl:template>

</xsl:stylesheet>

在此输入上运行时(带有一些其他值来演示其功能):

When run on this input (with a few additional values to demonstrate its functionality):

<Nodes>
  <NodeA NodeAattr="123">

    <NodeB NodeBattr="456"></NodeB>

    <NodeC>
      <NodeD NodeDAttr="ValueD">
        <NodeE Name="ValueABC"> "555" </NodeE >
        <NodeE Name="ValueABC"> "666" </NodeE>
        <NodeE Name="ValueDEF"> "555" </NodeE >
        <NodeE Name="ValueDEF"> "565" </NodeE >
        <NodeE Name="ValueDEF"> "575" </NodeE >
        <NodeE Name="ValueABC"> "595" </NodeE >
      </NodeD>
    </NodeC>
  </NodeA>
</Nodes>

结果是:

<Nodes>
  <NodeA NodeAattr="123">
    <NodeB NodeBattr="456" />
    <NodeC>
      <NodeD NodeDAttr="ValueD">
        <NodeE Name="ValueABC"> "555" , "666" </NodeE>
        <NodeE Name="ValueDEF"> "555" , "565" , "575" </NodeE>
        <NodeE Name="ValueABC"> "595" </NodeE>
      </NodeD>
    </NodeC>
  </NodeA>
</Nodes>

这篇关于如果属性的值相同,则XSL合并同级的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆