xml - 将节点添加到 XML 而不复制 xmlns =""属性

标签 xml xslt namespaces

嗯,我有这个 XML

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里没有显示),主要是增加了一个新的File VirtualHardwareSection末尾的节点

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=""部分在那里,只需复制已经存在的节点。我能做什么?

谢谢

最佳答案

我已经尝试使用 Saxon 9 HE 进行转换,并且没有添加额外的 namespace 声明,因此这要么是 XMLSpy 的奇怪之处,要么是您在问题中未显示的其他一些转换的人工制品。值得注意的是,在这种情况下,由于所讨论的元素具有前缀名称并且没有子元素 xmlns=""声明不会对结果 XML 的使用者造成任何问题(除了它对人类读者来说看起来有点难看)。

如果删除 xpath-default-namespace 是否会有所改善?并使用前缀代替?

关于xml - 将节点添加到 XML 而不复制 xmlns =""属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19561924/

相关文章:

java - 禁用单个元素的 XSD 验证?

java - 将方法添加到 org.w3c.dom.Node

javascript - 如何在 IE8 中通过 onLoad() 渲染多个 XSLT 文件

java - 使用 Java 创建基于另一个 XML 的 XML

java - 如何在 XML 中嵌入二进制数据?

xml - Haskell:使用 XML.Light 查找元素

xml - XSL 从文本中删除换行符

c++ - 为什么我的程序没有触及我所做的功能?

C++ 命名空间和包含

typescript - 环境命名空间 typescript 示例