我有一个像这样的XML文件:
<site="X">
<function="DATA">
<address>10.0.0.0/24></address>
</function>
</site>
<site="X">
<function="DATA">
<address>10.2.0.0/24></address>
</function>
</site>
<site="X">
<function="VOICE">
<address>10.4.0.0/24></address>
</function>
</site>
.... other entries
我想将它组合在一起,如:
<site="X">
<function="DATA">
<address>10.0.0.0/24></address>
<address>10.2.0.0/24></address>
</function>
<function="VOICE">
<address>10.40.0.0/24</address>
</function>
任何想法如何做到这一点?
答案 0 :(得分:2)
您可以使用XSLT根据site
和function
元素执行相关记录的分组,然后进行后续转换。以下XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="siteKey" match="site" use="@a"/>
<xsl:key name="functionKey" match="function" use="concat(parent::site/@a, '|', @b)"/>
<xsl:template match="s">
<xsl:copy>
<xsl:for-each select="site[generate-id(.)=generate-id(key('siteKey',@a)[1])]">
<xsl:copy>
<xsl:copy-of select="@a"/>
<xsl:for-each select="key('siteKey', @a)">
<xsl:for-each select="./function[generate-id(.)=generate-id(key('functionKey',concat(parent::site/@a, '|', @b))[1])]">
<xsl:copy>
<xsl:copy-of select="@b"/>
<xsl:copy-of select="key('functionKey', concat(parent::site/@a, '|', @b))/address"/>
</xsl:copy>
</xsl:for-each>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
应用于此输入时 (注意:我已经编辑了你提供的xml,以便生效):
<s>
<site a="X">
<function b="DATA">
<address>10.0.0.0/24</address>
</function>
</site>
<site a="X">
<function b="DATA">
<address>10.2.0.0/24</address>
</function>
</site>
<site a="X">
<function b="VOICE">
<address>10.4.0.0/24</address>
</function>
</site>
</s>
生成此输出:
<s>
<site a="X">
<function b="DATA">
<address>10.0.0.0/24</address>
<address>10.2.0.0/24</address>
</function>
<function b="VOICE">
<address>10.4.0.0/24</address>
</function>
</site>
</s>
进一步阅读XSLT分组:http://www.jenitennison.com/xslt/grouping/muenchian.html
答案 1 :(得分:0)
以下输入失败:
<s>
<site a="X">
<function b="DATA">
<address>10.0.0.0/24</address>
</function>
</site>
<site a="X">
<function b="VOICE">
<address>10.2.0.0/24</address>
</function>
</site>
<site a="Y">
<function b="VOICE">
<address>10.4.0.0/24</address>
</function>
</site>
</s>
它给出了:
<s>
<site a="X">
<function b="DATA">
<address>10.0.0.0/24</address>
</function>
<function b="VOICE">
<address>10.2.0.0/24</address>
<address>10.4.0.0/24</address>
</function>
</site>
<site a="Y"/>
</s>