如何将子元素解析为另一个相关元素

时间:2009-11-26 10:06:06

标签: xslt

祝你好运,

我使用Castor将网络基础架构映射到Java类。我的XML文件如下所示:

<SPECTRUM_Topology>
  <Topology>
    <!-- Device information -->
    <Device ip_dnsname="172.20.162.1" ... />
  </Topology>
  <Update>
    <Device ip_dnsname="172.20.162.1">
       <!-- Port information -->
       <Port ... />
       <Port ... />
    </Device>
  </Update>
</SPECTRUM_Topology>

我需要文件看起来像这样:

<SPECTRUM_Topology>
  <Topology>
    <!-- Device information -->
    <Device ip_dnsname="172.20.162.1" ...>
       <!-- Port information -->
       <Port ... />
       <Port ... />
    </Device>
  </Topology>
</SPECTRUM_Topology>

有没有办法通过XSLT做到这一点?

1 个答案:

答案 0 :(得分:2)

不确定。只需创建一个与拓扑中的Device标记匹配的特定模板,然后在其中插入更新/设备标记内容。

这可能会让你开始:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:key name="devices" match="/SPECTRUM_Topology/Update/Device" use="@ip_dnsname"/>

    <xsl:template match="Device">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates select="key('devices', @ip_dnsname)/*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@* | node()">
        <xsl:if test="not(self::Update)">
            <xsl:copy>
                <xsl:apply-templates select="@* | node()"/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>