[Home] [By Thread] [By Date] [Recent Entries]
Heiko Niemann wrote:
Does that stylesheet you posted really output the above nicely indented document? I think because of the empty template for text() nodes you lose the indentation. So base/data and update/data are merged. Each element in base/data is copied unless the same element exists in update/data; then it will be overwritten. Your stylesheet relies on built-in templates to process the branch you are interested and then suppresses any output from other branches. You could instead write a template for the root node that ensures only the branch you are interested in is processed, then you don't need to suppress output from other branches. And you could use a key to find the update stuff: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="k1" match="/root/update/data/*" use="node-name(.)"/> <xsl:template match="/">
<xsl:apply-templates select="root/base/data"/>
</xsl:template> <xsl:template match="/root/base/data">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template> <xsl:template match="/root/base/data/*">
<xsl:variable name="var.update" select="key('k1', node-name(.))"/>
<xsl:choose>
<xsl:when test="exists($var.update)">
<xsl:copy-of select="$var.update"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template></xsl:stylesheet> -- Martin Honnen http://msmvps.com/blogs/martin_honnen/
|

Cart



