Альтернативное, несколько более простое, двухпроходное решение (без xsl:variable
, без generate-id()
, без значений, разделенных трубами, но с использованием msxsl:node-set()
) :
<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:variable name="vrtfPass1">
<xsl:apply-templates mode="pass1"/>
</xsl:variable>
<xsl:template match="/*">
<root>
<xsl:for-each select=
"msxsl:node-set($vrtfPass1)/*/*">
<xsl:sort select="*[1]/@pub-date" order="descending"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</root>
</xsl:template>
<xsl:template match="node()|@*" mode="pass1">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="pass1"/>
</xsl:copy>
</xsl:template>
<xsl:template match="section" mode="pass1">
<section id="{@id}">
<xsl:apply-templates select="*" mode="pass1">
<xsl:sort select="@pub-date" order="descending"/>
</xsl:apply-templates>
</section>
</xsl:template>
</xsl:stylesheet>
при применении к следующему документу XML (на основе предоставленного, но сделанного более "интересного"):
<root>
<section id="1">
<news-item id="1" pub-date="2012-01-03" />
<news-item id="2" pub-date="2012-01-04" />
<news-item id="3" pub-date="2011-12-21" />
</section>
<section id="2">
<news-item id="4" pub-date="2012-01-05" />
<news-item id="5" pub-date="2012-01-06" />
<news-item id="6" pub-date="2012-01-07" />
<news-item id="7" pub-date="2222-12-22" />
</section>
<section id="3">
<news-item id="7" pub-date="2012-02-10" />
<news-item id="8" pub-date="2012-02-11" />
<news-item id="9" pub-date="2012-02-12" />
</section>
</root>
желаемый, правильный результат получается :
<root>
<root>
<section id="2">
<news-item id="7" pub-date="2222-12-22"/>
<news-item id="6" pub-date="2012-01-07"/>
<news-item id="5" pub-date="2012-01-06"/>
<news-item id="4" pub-date="2012-01-05"/>
</section>
<section id="3">
<news-item id="9" pub-date="2012-02-12"/>
<news-item id="8" pub-date="2012-02-11"/>
<news-item id="7" pub-date="2012-02-10"/>
</section>
<section id="1">
<news-item id="2" pub-date="2012-01-04"/>
<news-item id="1" pub-date="2012-01-03"/>
<news-item id="3" pub-date="2011-12-21"/>
</section>
</root>
</root>