What I would do instead of trying to add the new issue
(s) is to combine all of the issue
s from both files and then recreate the structure.
This might not work for your actual use case because you said:
(content of files has been oversimplified to show only relevant elements)
but hopefully it gives you another perspective and/or starting point.
You will probably want to add an identity transform and replace xsl:copy-of
and xsl:perform-sort
with xsl:apply-templates
. You will also need to update xsl:param
to point to an external file.
XML Input (modified slightly to add more years and change numbering for testing)
<list>
<decade lastyear="2012" firstyear="2011">
<year value="2012">
<issue year="2012" number="242" />
<issue year="2012" number="241" />
<issue year="2012" number="240" />
</year>
<year value="2011">
<issue year="2011" number="238" />
<issue year="2011" number="237" />
<issue year="2011" number="236" />
<issue year="2011" number="235" />
</year>
</decade>
<decade lastyear="2010" firstyear="2001">
<year value="2010">
<issue year="2010" number="234" />
<issue year="2010" number="232" />
<issue year="2010" number="233" />
<issue year="2010" number="231" />
<issue year="2010" number="230" />
</year>
<year value="2009">
<issue year="2009" number="229" />
<issue year="2009" number="228" />
<issue year="2009" number="227" />
<issue year="2009" number="226" />
<issue year="2009" number="225" />
</year>
<year value="2001">
<issue year="2001" number="123" />
</year>
</decade>
</list>
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<!--This can be changed to point to an external XML file.-->
<xsl:param name="up">
<issue year="2013" number="245" />
<issue year="2002" number="135" />
<issue year="2011" number="239" />
</xsl:param>
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:for-each-group select="($up/issue|*/*/issue)" group-by="floor((number(@year) - 1) div 10)">
<xsl:sort select="@year" data-type="number" order="descending"/>
<decade lastyear="{max(current-group()/@year)}" firstyear="{min(current-group()/@year)}">
<xsl:for-each-group select="current-group()" group-by="@year">
<xsl:sort select="current-grouping-key()" data-type="number" order="descending"/>
<year value="{current-grouping-key()}">
<xsl:perform-sort select="current-group()">
<xsl:sort select="@number" data-type="number" order="descending"/>
</xsl:perform-sort>
</year>
</xsl:for-each-group>
</decade>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XML Output
<list>
<decade lastyear="2013" firstyear="2011">
<year value="2013">
<issue year="2013" number="245"/>
</year>
<year value="2012">
<issue year="2012" number="242"/>
<issue year="2012" number="241"/>
<issue year="2012" number="240"/>
</year>
<year value="2011">
<issue year="2011" number="239"/>
<issue year="2011" number="238"/>
<issue year="2011" number="237"/>
<issue year="2011" number="236"/>
<issue year="2011" number="235"/>
</year>
</decade>
<decade lastyear="2010" firstyear="2001">
<year value="2010">
<issue year="2010" number="234"/>
<issue year="2010" number="233"/>
<issue year="2010" number="232"/>
<issue year="2010" number="231"/>
<issue year="2010" number="230"/>
</year>
<year value="2009">
<issue year="2009" number="229"/>
<issue year="2009" number="228"/>
<issue year="2009" number="227"/>
<issue year="2009" number="226"/>
<issue year="2009" number="225"/>
</year>
<year value="2002">
<issue year="2002" number="135"/>
</year>
<year value="2001">
<issue year="2001" number="123"/>
</year>
</decade>
</list>