2013-10-24 68 views
2

嗯,我有這個XML添加節點XML不復制的xmlns = 「」 屬性

XML

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Built using IBM Image Construction and Composition Tool, version: 1.2.0.1-20121129-1310-255 on: Oct 18, 2013 12:14:22 --> 
<Envelope 
    xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" 
    xmlns:cloudburst="http://www.ibm.com/websphere/rainmaker/2009/3" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" 
    xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" cloudburst:name="POSTGRES-9.2.4-RHEL-64.X64.ATF.PRB" 
    cloudburst:version="1.0.0" cloudburst:build="sample" cloudburst:serviceLevel="0" 
    cloudburst:description="BASEIMAGE FOR POSTGRESQL 9.2.4" cloudburst:symbolicName="POSTGRES-9.2.4-RHEL-64.X64.ATF.PRB"> 
    (...) 

    <VirtualSystem ovf:id="POSTGRES-9.2.4-RHEL-64.X64.ATF.PRB.BASE"> 

    <Name>BASEIMAGE FOR POSTGRESQL 9.2.4</Name> 

    <VirtualHardwareSection ovf:transport="iso"> 
     (...) 
     <Item> 
     <rasd:Caption>2 virtual CPUs</rasd:Caption> 
     <rasd:Description>Number of virtual CPUs</rasd:Description> 
     <rasd:ElementName>2 virtual CPUs</rasd:ElementName> 
     <rasd:InstanceID>1</rasd:InstanceID> 
     <rasd:ResourceType>3</rasd:ResourceType> 
     <rasd:VirtualQuantity>2</rasd:VirtualQuantity> 
     </Item> 
     <Item> 
     <rasd:Caption>SCSI Controller 0</rasd:Caption> 
     <rasd:ElementName>SCSI Controller 0</rasd:ElementName> 
     <rasd:InstanceID>8</rasd:InstanceID> 
     <rasd:ResourceSubType>lsilogic</rasd:ResourceSubType> 
     <rasd:ResourceType>6</rasd:ResourceType> 
     </Item> 

,我想通過編輯一些Item標籤和屬性進行修改(已在XSL belo中沒有顯示),並且主要在VirtualHardwareSection的末端添加新的File節點

XSL

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" 
xpath-default-namespace="http://schemas.dmtf.org/ovf/envelope/1" 
exclude-result-prefixes="ns" > <!-- Para que no copie el ns: y su URI en NetworkSection --> 

    <xsl:output method="xml" indent="yes"/> 
    <!--<xsl:preserve-space elements="*"/>--> 
    <xsl:template match="node() | @*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Añadimos un nodo a VirtualHardwareSection --> 
    <xsl:template match="Envelope/VirtualSystem/VirtualHardwareSection"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> <!-- Copiamos lo que ya está incluido en el nodo --> 
       <!-- *** Lo copia pero añade un atributo vacio: xmlns="" --> 
      <Item>                        <!-- v Añadimos las siguientes líneas: v --> 
       <rasd:AddressOnParent>0</rasd:AddressOnParent> 
       <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> 
       <rasd:Caption>Ethernet adapter on &quot;Network 2&quot;</rasd:Caption> 
       <rasd:Connection>Network 2</rasd:Connection> 
       <rasd:ElementName>eth1</rasd:ElementName> 
       <rasd:InstanceID>13</rasd:InstanceID> 
       <rasd:ResourceSubType>VMXNET3</rasd:ResourceSubType> 
       <rasd:ResourceType>10</rasd:ResourceType> 
      </Item>                        <!--^Añadimos las siguientes líneas:^ --> 

     </xsl:copy>  <!-- lo unico que lo coloca al final del nodo VirtualHardwareSection, estaria bien que pudiera ponerse despues del nodo con igual ResourceType --> 
    </xsl:template> 

然而,當我使用變換Altova的XMLSpy的2013年XML,我結束了這一點:

<Item> 
    <rasd:AddressOnParent xmlns="">0</rasd:AddressOnParent> 
    <rasd:AutomaticAllocation xmlns="">true</rasd:AutomaticAllocation> 
    <rasd:Caption xmlns="">Ethernet adapter on "Network 2"</rasd:Caption> 
    <rasd:Connection xmlns="">Network 2</rasd:Connection> 
    <rasd:ElementName xmlns="">eth1</rasd:ElementName> 
    <rasd:InstanceID xmlns="">13</rasd:InstanceID> 
    <rasd:ResourceSubType xmlns="">VMXNET3</rasd:ResourceSubType> 
    <rasd:ResourceType xmlns="">10</rasd:ResourceType> 
</Item> 

我不想xmlns=""部分在那裏,只是複製像那些已經存在的節點。我能做什麼?

感謝

回答

1

我已經試過你的轉型與撒克遜9 HE和不添加額外的命名空間聲明,所以這是任何的XMLSpy的古怪或改造的一些其他位的時代產物你沒有在問題中顯示。值得注意的是,在這種情況下,由於所涉及的元素具有前綴名稱和子元素,所以聲明不會給產生的XML的消費者帶來任何問題(除了它對於人類讀者來說看起來有點醜陋)。

如果您刪除xpath-default-namespace並改用前綴,是否會改善問題?

+1

值得指出的是,無論是否存在多餘的xmlns =「」聲明,XDM結果樹都是完全相同的。唯一的區別在於序列化,並且重新分析都會給出相同的XDM樹。我不確定沒有詳細檢查序列化規範是否允許冗餘聲明,但事實是它唯一的問題是整型。 –

+0

嗨,抱歉這麼久纔回復。謝謝你的回答,不幸的是我不能使用其他程序,因爲我沒有足夠的權限來安裝任何東西。但是,這些額外的屬性似乎不會影響我的文件,因爲它們沒有被使用,所以我可以放心地忽略它們。我希望其他人看到這個答案並嘗試一下,看看在他們的情況下是否有助於將答案標記爲已接受。 – fernandopcg

+0

@fernandopcg夠公平的。順便說一句,將'xmlns =「...」'指定爲「屬性」是錯誤的 - 這是一個名稱空間聲明,您不能將其視爲XSLT中的屬性(或任何其他支持名稱空間的XML處理工具)。 –