Using xsl:evaluate and the path() function to merge data from two documents with the same structure
On Stackoverflow there was a question to merge two documents with the same XML structure by copying text data from elements in a secondary input document to empty elements in the main input. I think this can be nicely done by using the path() function on empty elements together with the xsl:evaluate instruction (that is new in XSLT 3.0) to simply select and copy the text data from the secondary input document
<xsl:template match="*[not(has-children())]">
<xsl:copy>
<div class="merged">
<xsl:evaluate context-item="$doc2" xpath="path() || '/text()'"></xsl:evaluate>
</div>
</xsl:copy>
</xsl:template>
Full gist is
The posted stylesheet works fine with Saxon 9.7 and later editions supporting xsl:evaluate (PE and EE) and with current versions of Altova XMLSpy/Raptor.
<xsl:template match="*[not(has-children())]">
<xsl:copy>
<div class="merged">
<xsl:evaluate context-item="$doc2" xpath="path() || '/text()'"></xsl:evaluate>
</div>
</xsl:copy>
</xsl:template>
Full gist is
The posted stylesheet works fine with Saxon 9.7 and later editions supporting xsl:evaluate (PE and EE) and with current versions of Altova XMLSpy/Raptor.
Comments
Post a Comment