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