这是问题,我有一个不完整的文档(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更新,因为它尚不支持)。
编辑:我只想确切地说这只是问题的简化表述。实际上,我们有更多要添加的元素,实际上将从用户输入中获取值...
答案 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>
讨论:
此解决方案比尝试实施任何类型的动态评估简单得多。
指定所需更改的XML文档是紧凑的。
逻辑是直的,不像任何部分动态评估实施那样复杂。
无需额外的XSLT文档。
这是一个简单易行的实施,理解和维护解决方案。