Вы сортируете на неправильном уровне. Если вы хотите отсортировать документы, вам нужен шаблон, который соответствует <Directory>
и содержит apply-templates
с сортировкой.
Если все, что вы делаете, это копируете входные данные в выходные данные с сортировкой, выполните поиск в Google по запросу «xsl identity transform» и добавьте шаблон, соответствующий «Directory».
Вот решение
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Directory">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()">
<xsl:sort select="@Name"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
В точке, где вы сопоставили Directory
, и внутри apply-templates
узел контекста является каждым Document
по очереди. Так что сортировка должна быть просто @Name
.
Подробное объяснение:
- Первый шаблон - это «шаблон идентификации» (запомните эту форму, вы будете часто ее использовать).
- Второй шаблон специализируется на обработке только для узлов «Каталог».
- Первый
apply-templates
копирует любые атрибуты
- Второй
apply-templates
копирует дочерние узлы после сортировки
- Оба эти шаблона неявно повторно используют шаблон преобразования идентификаторов