【发布时间】:2016-09-29 18:32:35
【问题描述】:
我正在尝试使用 XSLT 转换 XML 文件以实现以下目的:
将节点的所有元素转换为该节点的属性,并在节点内包含节点之外的元素。
为了更清楚一点,我将举一个例子。 我的初始 XML 文件如下所示:
<?xml version="1.0" ?>
<queryResponse type="InventoryDetails" rootUrl="https://10.30.0.192/webacs/api/v1/data"
requestUrl="https://10.30.0.192/webacs/api/v1/data/InventoryDetails?.full=true&.firstResult=0&.maxResults=1000"
responseType="listEntityInstances" count="13" first="0" last="12">
<entity url="https://10.30.0.192/webacs/api/v1/data/InventoryDetails/521521"
type="InventoryDetails" dtoType="inventoryDetailsDTO">
<inventoryDetailsDTO id="521521" displayName="521521">
<deviceId>541541</deviceId>
<ethernetInterfaces>
<ethernetInterface>
<accessVlan>815</accessVlan>
<adminStatus>DOWN</adminStatus>
<allowedVlanIds>ALL</allowedVlanIds>
<desiredTrunkingEncapsulation>NEGOTIATE_OR_BEING_NEGOTIATED</desiredTrunkingEncapsulation>
<desiredVlanMode>ACCESS</desiredVlanMode>
<duplexMode>FULLDUPLEX</duplexMode>
<macAddress>6c:99:89:45:a4:8d</macAddress>
<mtu>1500</mtu>
<name>GigabitEthernet1/0/13</name>
<nativeVlan>1</nativeVlan>
<operationalStatus>DOWN</operationalStatus>
<operationalVlanMode>DOWN</operationalVlanMode>
<pruneEligibleVlanIds>2-1001</pruneEligibleVlanIds>
<speed>
<instanceId>0</instanceId>
<instanceVersion>0</instanceVersion>
<longAmount>1000000000</longAmount>
</speed>
<trunkingEncapsulationNegotiation>false</trunkingEncapsulationNegotiation>
</ethernetInterface>
<ethernetInterface>
<accessVlan>1</accessVlan>
<adminStatus>UP</adminStatus>
<allowedVlanIds>6,11</allowedVlanIds>
<desiredTrunkingEncapsulation>_8021Q</desiredTrunkingEncapsulation>
<desiredVlanMode>TRUNK</desiredVlanMode>
<duplexMode>FULLDUPLEX</duplexMode>
<macAddress>6c:99:89:45:a4:92</macAddress>
<mtu>1500</mtu>
<name>GigabitEthernet1/0/18</name>
<nativeVlan>1</nativeVlan>
<operationalStatus>UP</operationalStatus>
<operationalTrunkEncapsulation>_8021Q</operationalTrunkEncapsulation>
<operationalVlanMode>TRUNK</operationalVlanMode>
<pruneEligibleVlanIds>2-1001</pruneEligibleVlanIds>
<speed>
<instanceId>0</instanceId>
<instanceVersion>0</instanceVersion>
<longAmount>1000000000</longAmount>
</speed>
<trunkingEncapsulationNegotiation>true</trunkingEncapsulationNegotiation>
</ethernetInterface>
<modules>
<module>
<description>Switch 2 - WS-C3750X-48 - Fixed Module 0</description>
<equipmentId>546563</equipmentId>
<equipmentType>MODULE</equipmentType>
<operationStatus>ok</operationStatus>
<physicalLocation>WS-C3750X-48</physicalLocation>
<productName>Switch 2 - WS-C3750X-48 - Fixed Module 0</productName>
<softwareVersion>15.0(2)SE7</softwareVersion>
<vendorType>cevModuleCat3750x48</vendorType>
</module>
<module>
<description>FRULink 10G SM Module</description>
<equipmentId>546565</equipmentId>
<equipmentType>MODULE</equipmentType>
<operationStatus>ok</operationStatus>
<physicalLocation>FRULink Container</physicalLocation>
<productName>Switch 2 - FRULink Slot 1 - FRULink Module</productName>
<softwareVersion>15.0(2)SE7</softwareVersion>
<vendorType>cevC3KxSm10g</vendorType>
</module>
</modules>
</ethernetInterfaces>
</inventoryDetailsDTO>
</entity>
</queryResponse>
我的结果需要如下:
<Data>
<ethernetInterface deviceID="xxx" accessVlan="xxxx" adminStatus="xxxx"/>
<ethernetInterface devideID="xxx" accessVlan="xxxx" adminStatus="xxxx"/>
</Data>
这基本上适用于<entity> 节点内的每个节点和所有属性。
虽然我可以获取一些数据以正确格式化,但我要么得到太多(它只格式化我指定的内容,其余部分仍被复制但未格式化)而且你看到的 DeviceID 不在我得到的节点内属性来自但在一个单独的兄弟节点中。
【问题讨论】: