可以分组的XML格式化程序

时间:2017-11-21 18:58:14

标签: xml formatting grouping

我有一个像这样的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>

任何想法如何做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以使用XSLT根据sitefunction元素执行相关记录的分组,然后进行后续转换。以下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>

http://xsltransform.net/jxDigV9/3