вставка элемента в XML-документ с использованием его xpath - PullRequest
1 голос
/ 06 мая 2011

Вот проблема, у меня неполный документ (docA), и я хотел бы вставить некоторый элемент xml в определенную позицию, определенную строкой xpath (в элементе doc elementList), чтобы получить полный документ (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 Ответ

1 голос
/ 06 мая 2011

Это можно сделать очень легко, вам нужно лишь немного изменить документ "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. Это простое и легкое в реализации, понимании и обслуживании решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...