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