如何合并具有“相同的父亲”,相同的方法和相同的id = 0(使用XSLT)的两个节点?(how to

2019-07-30 08:53发布

我需要他们具有相同的合并这两个节点街道

  • 父节点:纽约市
  • 同样的方法:修改
  • 同一ID:0

属性的值必须合并(见输出文件在这篇文章的末尾)

这里是输入文件:

<country>
<state id="NEW JERSEY">
    <city id="NEW YORK">
     <district id="BRONX" method="modify">

        <street id="0" method="modify">
           <attributes>
              <temperature>98</temperature>
              <altitude>1300</altitude>
           </attributes>
        </street>

        <dadada id="99" method="modify" />

        <street id="0" method="modify">
           <attributes>
              <temperature>80</temperature>
              <streetnumber> 67 </streetnumber>
           </attributes>
        </street>

        <dididi id="432" method="modify" />

     </district>


  </city>

</state>

预期输出:

<country>
<state id="NEW JERSEY">
    <city id="NEW YORK">
     <district id="BRONX" method="modify">

        <street id="0" method="modify">
           <attributes>
              <temperature>80</temperature>
              <altitude>1300</altitude>
              <streetnumber> 67 </streetnumber>
           </attributes>
        </street>

        <dadada id="99" method="modify" />

        <dididi id="432" method="modify" />

     </district>

  </city>

</state>
</country>

请帮帮忙,我才刚刚开始XSLT

Answer 1:

我假定你有兴趣在XSLT 2.0,因为那是你如何标记你的问题。 让我知道如果你需要的XSLT 1.0当量。 这XSLT 2.0样式表应该做的伎俩...

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

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

<xsl:template match="*[street]">
  <xsl:copy>
   <xsl:apply-templates select="@*"/>
   <xsl:for-each-group select="street" group-by="@method">
    <xsl:apply-templates select="current-group()[1]" />
   </xsl:for-each-group>
   <xsl:apply-templates select="node()[not(self::street)]"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="street/attributes">
 <xsl:copy>
  <xsl:apply-templates select="@*"/>
   <xsl:variable name="grouped-method" select="../@method" />  
   <xsl:for-each-group select="../../street[@method=$grouped-method]/attributes/*" group-by="name()">
    <xsl:apply-templates select="current-group()[1]" />
   </xsl:for-each-group>    
  <xsl:apply-templates select="comment()|processing-instruction()"/>
 </xsl:copy>
</xsl:template>

</xsl:stylesheet> 

说明

第二个模板,其上街头的父母元素,将匹配由一群普通的方法子街道。 对于每个组,只有组中的第一街道被复制。 其余的都将被丢弃。

当组第一街是一种在第三模板的“属性”节点过程中,我们合并所有同组的属性。 也许“属性”是一个XML文档中的一个不幸的元素名称! 这组通过查看所有的联盟街道具有相同街道父(布朗克斯区),并通过分组元素名称的所有的“属性”子节点来实现的。 如果存在这样的组中的多个元素,只取从第一个的值。

我不知道,这正是你想要的,因为虽然街道属性是由“父”节点(布朗克斯)合并,他们没有在城市一级合并。 这反映了你的问题的不确定性。 街道在您的样本数据的“父亲”节点区并不城市。 如果我有这种错误,并且希望在城市一级分组,请澄清和更新你的问题。



文章来源: how to merge two nodes having “the same father”, the same method and the same id=0 (using XSLT)?