Это простое преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kProdByName" match="product" use="name"/>
<xsl:variable name="vallProds" select=
"document('file:///c:/temp/delete/document_1.xml')/*/*
|
document('file:///c:/temp/delete/document_2.xml')/*/*
"/>
<xsl:template match="/*">
<xsl:variable name="vrtfProds">
<xsl:apply-templates select="$vallProds">
<xsl:sort select="name"/>
<xsl:sort select="Quantity" data-type="number"/>
</xsl:apply-templates>
</xsl:variable>
<products>
<xsl:for-each select="msxsl:node-set($vrtfProds)">
<xsl:copy-of select=
"*[generate-id() = generate-id(key('kProdByName', name)[1])]"/>
</xsl:for-each>
</products>
</xsl:template>
<xsl:template match="product">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
при применении к любому документу XML (может быть document.xml, но это не используется), и сдва предоставленных документа, расположенных по адресу: c:\temp\delete\document_1.xml
и c:\temp\delete\document_1.xml
,
, дают требуемый, правильный результат :
<products>
<product>
<name>Bag</name>
<Quantity>2</Quantity>
</product>
<product>
<name>Pen</name>
<Quantity>10</Quantity>
</product>
<product>
<name>Pencil</name>
<Quantity>5</Quantity>
</product>
</products>
Объяснение :
Сортировка product
элементов объединения двух документов по двум ключам : name
и Quantity
.
Извлечение регулярного дерева из RTF ( Фрагмент дерева результатов ), созданного на шаге 1. выше и выполняющего Мюнхенская группировка из product
по name
.