2017-01-27 6 views
0

У меня есть документ XML, которому в настоящее время не хватает пространства имен на уровне узла. Я хотел бы иметь возможность копировать пространства имен, определенные в документе скелета.XSLT: добавить пространства имен к узлам из скелета

Я обрабатываю документ с помощью Nokogiri (Ruby) и потребует XSLT 1.0 или любой другой жизнеспособный подход.

Возможно ли это?

Документ

<routing 
    xmlns:rt="urn:ietf:params:xml:ns:yang:ietf-routing" 
    xmlns:cisco-ospf="urn:ietf:params:xml:ns:yang:cisco-ospf" 
    xmlns:ospf-devs="http://cisco.com/ns/ietf-ospf/devs" 
    xmlns:ospf="urn:ietf:params:xml:ns:yang:ietf-ospf" 
    xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"> 
    <routing-instance> 
     <name>default</name> 
     <description>default-vrf [read-only]</description> 
     <routing-protocols> 
      <routing-protocol> 
       <type>ospf:ospfv2</type> 
       <name>100</name> 
       <ospf> 
        <instance> 
         <af>rt:ipv4</af> 
         <router-id>6.6.6.6</router-id> 
         <admin-distance> 
          <intra-area>100</intra-area> 
          <inter-area>200</inter-area> 
          <external>10</external> 
         </admin-distance> 
         <auto-cost> 
          <enable>true</enable> 
          <reference-bandwidth>5000</reference-bandwidth> 
         </auto-cost> 
         <area> 
         <area-id>50</area-id> 
         <default-cost>50</default-cost> 
         </area> 
         <area> 
         <area-id>100</area-id> 
         <default-cost>100</default-cost> 
         </area> 
         <area> 
         <area-id>300</area-id> 
         <virtual-link> 
          <router-id>8.8.8.8</router-id> 
          <hello-interval>80</hello-interval> 
         </virtual-link> 
         </area> 
         <area> 
         <area-id>666</area-id> 
         <default-cost>100</default-cost> 
         </area> 
         <redistribution> 
          <static> 
           <redist-option> 
            <metric>99999</metric> 
            <metric-type>1</metric-type> 
           </redist-option> 
          </static> 
         </redistribution> 
        </instance> 
       </ospf> 
      </routing-protocol> 
     </routing-protocols> 
    </routing-instance> 

Скелет

<routing 
    xmlns:rt="urn:ietf:params:xml:ns:yang:ietf-routing" 
    xmlns:cisco-ospf="urn:ietf:params:xml:ns:yang:cisco-ospf" 
    xmlns:ospf-devs="http://cisco.com/ns/ietf-ospf/devs" 
    xmlns:ospf="urn:ietf:params:xml:ns:yang:ietf-ospf" 
    xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"> 
    <routing-instance xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"> 
    <name xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"/> 
    <router-id xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"/> 
    <description xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"/> 
     <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"> 
     <interface xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"/> 
     </interfaces> 
     <routing-protocols xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"> 
      <routing-protocol xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"> 
      <name xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"/> 
      <static-routes xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"/> 
       <ospf xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"> 
        <instance xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"> 
        <af xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"/> 
        <router-id xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"/> 
         <admin-distance xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"> 
         <intra-area xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"/> 
         <inter-area xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"/> 
         <external xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"/> 
         </admin-distance> 
         <nsr xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"> 
         <enable xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"/> 
         </nsr> 
         <auto-cost xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"> 
         <enable xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"/> 
         <reference-bandwidth xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"/> 
         </auto-cost> 
         <area xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"> 
         <area-id xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"/> 
         <default-cost xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"/> 
         </area> 
         <default-metric xmlns="urn:ietf:params:xml:ns:yang:cisco-ospf"/> 
         <redistribution xmlns="urn:ietf:params:xml:ns:yang:cisco-ospf"> 
          <static xmlns="urn:ietf:params:xml:ns:yang:cisco-ospf"> 
           <redist-option xmlns="urn:ietf:params:xml:ns:yang:cisco-ospf"> 
           <metric xmlns="urn:ietf:params:xml:ns:yang:cisco-ospf"/> 
           <metric-type xmlns="urn:ietf:params:xml:ns:yang:cisco-ospf"/> 
           </redist-option> 
          </static> 
         </redistribution> 
        </instance> 
       </ospf> 
      </routing-protocol> 
     </routing-protocols> 
    </routing-instance> 

Желаемый выход

<routing 
    xmlns:rt="urn:ietf:params:xml:ns:yang:ietf-routing" 
    xmlns:cisco-ospf="urn:ietf:params:xml:ns:yang:cisco-ospf" 
    xmlns:ospf-devs="http://cisco.com/ns/ietf-ospf/devs" 
    xmlns:ospf="urn:ietf:params:xml:ns:yang:ietf-ospf" 
    xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"> 
    <routing-instance xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"> 
     <name>default</name> 
     <description>default-vrf [read-only]</description> 
     <routing-protocols> 
      <routing-protocol> 
       <type>ospf:ospfv2</type> 
       <name>100</name> 
       <ospf xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf"> 
        <instance> 
         <af>rt:ipv4</af> 
         <router-id>6.6.6.6</router-id> 
         <admin-distance> 
          <intra-area>100</intra-area> 
          <inter-area>200</inter-area> 
          <external>10</external> 
         </admin-distance> 
         <auto-cost> 
          <enable>true</enable> 
          <reference-bandwidth>5000</reference-bandwidth> 
         </auto-cost> 
         <area> 
         <area-id>50</area-id> 
         <default-cost>50</default-cost> 
         </area> 
         <area> 
         <area-id>100</area-id> 
         <default-cost>100</default-cost> 
         </area> 
         <area> 
         <area-id>300</area-id> 
         <virtual-link> 
          <router-id>8.8.8.8</router-id> 
          <hello-interval>80</hello-interval> 
         </virtual-link> 
         </area> 
         <area> 
         <area-id>666</area-id> 
         <default-cost>100</default-cost> 
         </area> 
         <redistribution xmlns="urn:ietf:params:xml:ns:yang:cisco-ospf"> 
          <static> 
           <redist-option> 
            <metric>99999</metric> 
            <metric-type>1</metric-type> 
           </redist-option> 
          </static> 
         </redistribution> 
        </instance> 
       </ospf> 
      </routing-protocol> 
     </routing-protocols> 
    </routing-instance> 

+0

Какова была цель этого повторения? По умолчанию пространство имен наследуется. –

+0

Пространства имен могут меняться по всему документу. В этом конкретном примере используются два пространства имен, но в больших документах это может быть несколько. –

+0

Я боюсь, что это довольно запутанно. Во-первых, нет необходимости повторять декларацию пространства имен, как показано на вашем выходе. Вам это нужно только в корневом элементе 'routing' и элементе' ospf'. Другая головоломка - это роль документа скелета. Вы надеетесь, что ваша таблица стилей прочитает это и соответствующим образом отрегулирует выход? Это было бы довольно сложно реализовать в XSLT 1.0. Вы уверены, что вам это нужно? Пространства имен обычно продиктованы схемой - и схемы обычно не меняются так дико. –

ответ

0

Ваш нужный документ содержит много лишних объявлений пространств имен.

Невозможно заставить сериализатор XSLT выводить избыточные объявления пространства имен.

Это потому, что трудно увидеть какую-либо вескую причину, по которой кто-то их захочет.

Если ваша настоящая цель состоит в том, чтобы изменить пространства имен элементов в соответствии с определением файла сопоставления, а не выводить избыточные объявления пространства имен, представляющие эти пространства имен, тогда было бы лучше изменить этот пример.

Смежные вопросы