我需要合并两个节点街道,因为它们具有相同的:
- 父节点:纽约市
- 相同的方法:修改
- 相同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
我假设您对XSLT2.0感兴趣,因为这就是您标记问题的方式。如果您需要XSLT1.0等同物,请告诉我。这个XSLT2.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文档中,"attributes"可能是一个错误的元素名称!通过查看具有相同街道父级(布朗克斯区)的所有联合街道的所有"属性"子节点并按元素名称进行分组,可以实现此分组。如果在这样一个组中有多个元素,只需取第一个元素的值即可。
我不确定这是否正是您想要的,因为尽管街道属性是由"父亲"节点(布朗克斯)合并的,但它们不是在城市级别合并的。这反映出你的问题含糊不清。样本日期中街道的"父亲"节点是地区而不是城市。如果我弄错了,并且您希望在城市级别进行分组,请澄清并更新您的问题。