将父节点添加到XML中的子节点



我有一个非常简单的问题,但是时间很短,所以如果有人能提供快速的答案,我将非常感激。基本上我有一个下面给出的XML:

 <Root>
<Delhi>
    <Population>1000</Population>`enter code here`
</Delhi>
<Mumbai>
    <Population>1000</Population>
    <District>
        <Name>Colaba</Name>
    </District>
    <District>
        <Name>navi Mumbai</Name>
    </District>
    <District></District>
</Mumbai>
<Mumbai>
    <Population>1000</Population>
</Mumbai>
<Mumbai>
    <Population>1000</Population>
</Mumbai>
<Chennai>
    <Population>1000</Population>
    <District>
        <Name>Chan</Name>
    </District>
</Chennai>
<Kolkata>
    <Population>1000</Population>
</Kolkata>

我想把这个XML传递给一个方法,并希望得到如下响应:

<Root>
<Delhi>
    <Population>1000</Population>
</Delhi>
<Mumbai>
    <Mumbai>
        <Population>1000</Population>
        <District>
            <District>
                <Name>Colaba</Name>
            </District>
            <District>
                <Name>navi Mumbai</Name>
            </District>
            <District></District>
        </District>
    </Mumbai>
    <Mumbai>
        <Population>1000</Population>
    </Mumbai>
    <Mumbai>
        <Population>1000</Population>
    </Mumbai>
</Mumbai>
<Chennai>
    <Chennai>
        <Population>1000</Population>
        <District>
            <District>
                <Name>Chan</Name>
            </District>
        </District>
    </Chennai>
</Chennai>
<Kolkata>
    <Population>1000</Population>
</Kolkata>

所以逻辑非常简单:我想遍历根元素的节点,然后检查节点是Mumbai、District还是Chennai。如果是的话,我将所有该名称的标记都包含在具有相同名称的标记中。XML可以有任何级别,所以我认为需要通过递归有效地完成。

考虑一个XSLT解决方案,大多数通用语言都为它维护库,包括Perl、PHP、Python、VB、Java和c#(以及其他语言)。作为信息,XSLT是一种声明性的专用编程语言(与SQL类型相同,但有数据库),专门用于转换、样式化、重新格式化或重新构造XML文档。

请注意:此XSLT脚本转换XML,但不处理仅复制两个无关的Mumbai节点,它们在您的文档中似乎不合适。

XSLT使用Muenchian方法将District项分组在一起。

<?xml version="1.0" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
  <xsl:output method="xml" indent="yes"/>
  <xsl:key name="MumbaiDistrict" match="Mumbai[1]" use="District" />
  <xsl:key name="ChennaiDistrict" match="Chennai" use="District" />
    <!-- Identity Transform -->
    <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:template>   
    <xsl:template match="Mumbai[1]">
      <xsl:element name="Mumbai">
        <xsl:element name="Mumbai">        
            <xsl:copy-of select="Population"/>
            <xsl:element name="District">
              <xsl:for-each select="key('MumbaiDistrict', District)">          
                <xsl:copy-of select="District"/>          
             </xsl:for-each>
           </xsl:element>          
         </xsl:element>
      </xsl:element>
    </xsl:template>
    <xsl:template match="Chennai">
      <xsl:element name="Chennai">
        <xsl:element name="Chennai">
           <xsl:copy-of select="Population"/>
           <xsl:element name="District">
             <xsl:for-each select="key('ChennaiDistrict', District)">          
              <xsl:copy-of select="District"/>          
             </xsl:for-each>
          </xsl:element>
        </xsl:element>
      </xsl:element>        
    </xsl:template>
</xsl:stylesheet>

<?xml version="1.0"?>
<Root>
  <Delhi><Population>1000</Population>`enter code here`
</Delhi>
  <Mumbai>
    <Mumbai>
      <Population>1000</Population>
      <District>
        <District>
          <Name>Colaba</Name>
        </District>
        <District>
          <Name>navi Mumbai</Name>
        </District>
        <District/>
      </District>
    </Mumbai>
  </Mumbai>
  <Mumbai>
    <Population>1000</Population>
  </Mumbai>
  <Mumbai>
    <Population>1000</Population>
  </Mumbai>
  <Chennai>
    <Chennai>
      <Population>1000</Population>
      <District>
        <District>
          <Name>Chan</Name>
        </District>
      </District>
    </Chennai>
  </Chennai>
  <Kolkata>
    <Population>1000</Population>
  </Kolkata>
</Root>

最新更新