使用xpath在xml文档中插入元素

时间:2011-05-06 08:45:57

标签: xml xslt xpath

这是问题,我有一个不完整的文档(docA),并希望在某个xpath字符串(在doc elementList中)定义的某个特定位置插入一些xml元素,以获得完整的文档(docB)。

基本上,鉴于文档docA:

<document>
    <information type="person">
        <id>string</id>
        <customer>
            <customerID>abc</customerID>
            <externalID>2</externalID>
            <person>
                <gender>M</gender>
                <firstName>John</firstName>
                <!-- here should be a middle name -->
                <lastName>Doe</lastName>
                <birthdate>2011-05-05</birthdate>
            </person>
            <!-- more elements... -->
        </customer>
        <!-- more elements... -->
    </information >
</document>

和elementList:

<newElementSet>
   <element>
      <name>Middle Name</name>
      <path>/document/information/customer/person/middleName</path>
      <value>Fitzgerald</value>
   </element>
   <!-- some more element could go there -->
</newElementSet>

输出文件应为:

<document>
    <information type="private">
        <id>string</id>
        <customer>
            <customerID>abc</customerID>
            <externalID>2</externalID>
            <person>
                <gender>M</gender>
                <firstName>John</firstName>
                <middleName>Fitzgerald</middleName>
                <lastName>Doe</lastName>
                <birthdate>2011-05-05</birthdate>
            </person>
                <!-- more elements... -->
        </customer>
        <!-- more elements... -->
    </information >
</document>

任何方式都可以在xslt中完成?我尝试使用Xquery,但似乎不可能(不能使用Xquery更新,因为它尚不支持)。

编辑:我只想确切地说这只是问题的简化表述。实际上,我们有更多要添加的元素,实际上将从用户输入中获取值...

1 个答案:

答案 0 :(得分:1)

这可以非常轻松地完成,您只需要稍微更改“elementList”文档 - 这个XML文档

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="person/firstName">
  <xsl:call-template name="identity"/>
  <middleName>Fitzgerald</middleName>
 </xsl:template>
</xsl:stylesheet>

然后只需将此转换应用于提供的源XML文档

<document>
    <information type="person">
        <id>string</id>
        <customer>
            <customerID>abc</customerID>
            <externalID>2</externalID>
            <person>
                <gender>M</gender>
                <firstName>John</firstName>
                <!-- here should be a middle name -->
                <lastName>Doe</lastName>
                <birthdate>2011-05-05</birthdate>
            </person>
            <!-- more elements... -->
        </customer>
        <!-- more elements... -->
    </information >
</document>

并生成了想要的正确结果

<document>
   <information type="person">
      <id>string</id>
      <customer>
         <customerID>abc</customerID>
         <externalID>2</externalID>
         <person>
            <gender>M</gender>
            <firstName>John</firstName>
            <middleName>Fitzgerald</middleName><!-- here should be a middle name -->
            <lastName>Doe</lastName>
            <birthdate>2011-05-05</birthdate>
         </person><!-- more elements... -->
      </customer><!-- more elements... -->
   </information>
</document>

讨论

  1. 此解决方案比尝试实施任何类型的动态评估简单得多。

  2. 指定所需更改的XML文档是紧凑的。

  3. 逻辑是直的,不像任何部分动态评估实施那样复杂。

  4. 无需额外的XSLT文档。

  5. 这是一个简单易行的实施,理解和维护解决方案。