Как разобрать дочерние элементы в другой связанный элемент - PullRequest
0 голосов
/ 26 ноября 2009

Доброго вам дня,

Я использую 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 Ответ

2 голосов
/ 26 ноября 2009

Конечно. Просто создайте определенный шаблон, который соответствует тегу Device в топологии, и вставьте туда содержимое тега Update / 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...