Нет никакой разницы между ними.
За исключением {}
, он не работает в C ++ 98.
Решение Mark Gravell почти правильно - с небольшой проблемой, которая создает два вложенных <contents>
элементы. Отметьте всем, кто предоставляет ответы: Действительно протестируйте свои решения!
Вот правильное решение. Это преобразование:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<!-- -->
<xsl:strip-space elements="*"/>
<!-- -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- -->
<xsl:template match="contents">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="contentitem">
<xsl:sort select="id" data-type="number"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
при применении на первоначально предоставленный XML-документ:
<top>
<elementA />
<elementB />
<contents>
<contentitem>
<id>3</id>
<moretags1 />
<moretags2 />
</contentitem>
<contentitem>
<id>2</id>
<moretags1 />
<moretags2 />
</contentitem>
<contentitem>
<id>1</id>
<moretags1 />
<moretags2 />
</contentitem>
</contents>
</top>
приводит к требуемому, корректному результату:
<top>
<elementA/>
<elementB/>
<contents>
<contentitem>
<id>1</id>
<moretags1/>
<moretags2/>
</contentitem>
<contentitem>
<id>2</id>
<moretags1/>
<moretags2/>
</contentitem>
<contentitem>
<id>3</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</top>
Действительно отметьте следующее:
Использование идентификационных данных управляет для копирования всех узлов без изменения.
Как шаблон идентификационных данных переопределяется с определенным сравнением с шаблонами contents
элемент
Использование <xsl:sort>
инструкция представить результаты применения шаблона в определенном порядке, возможно отличающемся от порядка документа узлов, выбранных для обработки.
Используйте xsl:sort или с xsl:for-каждым или с xsl:apply-шаблонами
Что-то как
<xsl:template match='/top/contents'>
<xsl:apply-templates select='contentitem'>
<xsl:sort select='id' data-type='number'/>
</xsl:apply-templates>
</xsl:template>
Несколько xsl:sort элементов могут использоваться для нескольких ключей сортировки.
Как насчет:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/top/contents">
<contents>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="contentitem">
<xsl:sort data-type="number" select="id"/>
</xsl:apply-templates>
</xsl:copy>
</contents>
</xsl:template>
</xsl:stylesheet>