XSLT «заменяет» значения другим файлом, сопоставляя одноуровневое текстовое содержимое - PullRequest
0 голосов
/ 10 ноября 2019

Я прошу помочь с заменой значений из двух файлов XML с помощью XSLT 1.0. Я верю, что я близок, но мне нужно какое-то руководство по тонкой настройке того, что я получил до сих пор.

Первая проблема: эти два XML-файла по сути одинаковы. Я заменяю два узла в первом файле на узлы из второго файла и всех его дочерних элементов, но моя текущая реализация создает дубликаты. Я уверен, что это потому, что мой XPath возвращает все узлы, которые я ему дал, но я не знаю, как настроить предикат так, чтобы он заменялся только в том случае, если он совпадает с узлом-родителем - в частности.

Файл 1 - Communications.xml

<?xml version="1.0" encoding="utf-8"?>
<Communications_Records xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Communications.xsd">
  <NetworkSwitch>
    <ChannelID>A</ChannelID>
    <SwitchName>OPS1</SwitchName>
    <RackNumber>T5553</RackNumber>
    <Elevation>A14</Elevation>
    <RoomLocation>Phoenix</RoomLocation> 
   <NetworkSwitchConfigModule>ops_switch_1_phx.txt</NetworkSwitchConfigModule>
    <Override>false</Override>
  </NetworkSwitch>

  <NetworkSwitch>
    <ChannelID>A</ChannelID>
    <SwitchName>OPS2</SwitchName>
    <RackNumber>Fill</RackNumber>
    <Elevation>Fill</Elevation>
    <RoomLocation>Fill</RoomLocation>
   <NetworkSwitchConfigModule>ops_switch_2_cle.txt</NetworkSwitchConfigModule>
    <Override>false</Override>
  </NetworkSwitch>

Файл 2 - Communications_2.xml

<?xml version="1.0" encoding="utf-8"?>
<Communications_Records xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Communications.xsd">
<NetworkSwitch>
    <ChannelID>A</ChannelID>
    <SwitchName>OPS1</SwitchName>
    <RackNumber>Fill</RackNumber>
    <Elevation>Fill</Elevation>
    <RoomLocation>Fill</RoomLocation>
    <NetworkModule>
      <ModuleNumber>2</ModuleNumber>
      <NetworkPort>
        <PortNumber>1</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>ASA1 (J5)</DeviceName>
      </NetworkPort>
      <NetworkPort>
        <PortNumber>10</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>CWA2 (J5)</DeviceName>
      </NetworkPort>
    </NetworkModule>
  </NetworkSwitch>
  <NetworkSwitch>
    <ChannelID>A</ChannelID>
    <SwitchName>OPS2</SwitchName>
    <RackNumber>ADAPTME</RackNumber>
    <Elevation>ADAPTME</Elevation>
    <RoomLocation>ADAPTME</RoomLocation>
    <NetworkModule>
      <ModuleNumber>2</ModuleNumber>
      <NetworkPort>
        <PortNumber>1</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>ASA1 (J4)</DeviceName>
      </NetworkPort>
      <NetworkPort>
        <PortNumber>10</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>CWA2 (J7)</DeviceName>
      </NetworkPort>
    </NetworkModule>
  </NetworkSwitch>
</Communications_Records>

Пока что мой XSLT -

<xsl:output method="xml" indent="yes" version="1.0" encoding="utf-8" />

<xsl:variable name="tempCommunications" select="document('Communications_2.xml')"/>

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
</xsl:template>

<xsl:template match="NetworkSwitchConfigModule">
   <xsl:copy-of select="$tempCommunications/Communications_Records/NetworkSwitch/NetworkModule"/>
</xsl:template>

<xsl:template match="Override">
</xsl:template>

Фактические результаты - final.xml

<?xml version="1.0" encoding="utf-8"?>
<Communications_Records xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Communications.xsd">
  <NetworkSwitch>
    <ChannelID>A</ChannelID>
    <SwitchName>OPS1</SwitchName>
    <RackNumber>T5553</RackNumber>
    <Elevation>A14</Elevation>
    <RoomLocation>Phoenix</RoomLocation>
    <NetworkModule>
      <ModuleNumber>2</ModuleNumber>
      <NetworkPort>
        <PortNumber>1</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>ASA1 (J5)</DeviceName>
      </NetworkPort>
      <NetworkPort>
        <PortNumber>10</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>CWA2 (J5)</DeviceName>
      </NetworkPort>
    </NetworkModule>
    <NetworkModule>
      <ModuleNumber>2</ModuleNumber>
      <NetworkPort>
        <PortNumber>1</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>ASA1 (J4)</DeviceName>
      </NetworkPort>
      <NetworkPort>
        <PortNumber>10</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>CWA2 (J7)</DeviceName>
      </NetworkPort>
    </NetworkModule>
  </NetworkSwitch>

  <NetworkSwitch>
    <ChannelID>A</ChannelID>
    <SwitchName>OPS2</SwitchName>
    <RackNumber>ADAPTME</RackNumber>
    <Elevation>ADAPTME</Elevation>
    <RoomLocation>ADAPTME</RoomLocation>
    <NetworkModule>
      <ModuleNumber>2</ModuleNumber>
      <NetworkPort>
        <PortNumber>1</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>ASA1 (J5)</DeviceName>
      </NetworkPort>
      <NetworkPort>
        <PortNumber>10</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>CWA2 (J5)</DeviceName>
      </NetworkPort>
    </NetworkModule>
    <NetworkModule>
      <ModuleNumber>2</ModuleNumber>
      <NetworkPort>
        <PortNumber>1</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>ASA1 (J4)</DeviceName>
      </NetworkPort>
      <NetworkPort>
        <PortNumber>10</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>CWA2 (J7)</DeviceName>
      </NetworkPort>
    </NetworkModule>
  </NetworkSwitch>
</Communications_Records>

Ожидаемые результаты - final.xml

<?xml version="1.0" encoding="utf-8"?>
<Communications_Records xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Communications.xsd">
  <NetworkSwitch>
    <ChannelID>A</ChannelID>
    <SwitchName>OPS1</SwitchName>
    <RackNumber>T5553</RackNumber>
    <Elevation>A14</Elevation>
    <RoomLocation>Phoenix</RoomLocation>
    <NetworkModule>
      <ModuleNumber>2</ModuleNumber>
      <NetworkPort>
        <PortNumber>1</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>ASA1 (J5)</DeviceName>
      </NetworkPort>
      <NetworkPort>
        <PortNumber>10</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>CWA2 (J5)</DeviceName>
      </NetworkPort>
    </NetworkModule>
  </NetworkSwitch>

  <NetworkSwitch>
    <ChannelID>A</ChannelID>
    <SwitchName>OPS2</SwitchName>
    <RackNumber>ADAPTME</RackNumber>
    <Elevation>ADAPTME</Elevation>
    <RoomLocation>ADAPTME</RoomLocation>
    <NetworkModule>
      <ModuleNumber>2</ModuleNumber>
      <NetworkPort>
        <PortNumber>1</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>ASA1 (J4)</DeviceName>
      </NetworkPort>
      <NetworkPort>
        <PortNumber>10</PortNumber>
        <DeviceType>Processor</DeviceType>
        <DeviceName>CWA2 (J7)</DeviceName>
      </NetworkPort>
    </NetworkModule>
  </NetworkSwitch>
</Communications_Records>

1 Ответ

0 голосов
/ 11 ноября 2019

Просто измените ваши шаблоны на

<xsl:template match="NetworkSwitchConfigModule">
    <xsl:copy-of select="$tempCommunications/Communications_Records/NetworkSwitch[SwitchName = current()/../SwitchName]/NetworkModule"/>
</xsl:template>

<xsl:template match="Override" />

Вы пропустили предикат для выбора правильных узлов из второго XML. Следовательно, вы копировали все NetworkModule элементы, а не только те, которые вы хотели. Предикат

SwitchName = current()/../SwitchName

сравнивает значение SwitchName из второго файла с родительским SwitchName текущего сопоставленного правила шаблона.

...