Как отсортировать подэлемент XML с XSLT

Нет никакой разницы между ними.

За исключением {}, он не работает в C ++ 98.

7
задан Daniel Schneller 21 February 2009 в 11:47
поделиться

3 ответа

Решение 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>

Действительно отметьте следующее:

  1. Использование идентификационных данных управляет для копирования всех узлов без изменения.

  2. Как шаблон идентификационных данных переопределяется с определенным сравнением с шаблонами contents элемент

  3. Использование <xsl:sort> инструкция представить результаты применения шаблона в определенном порядке, возможно отличающемся от порядка документа узлов, выбранных для обработки.

7
ответ дан 7 December 2019 в 03:21
поделиться

Используйте 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 элементов могут использоваться для нескольких ключей сортировки.

0
ответ дан 7 December 2019 в 03:21
поделиться

Как насчет:

<?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>
2
ответ дан 7 December 2019 в 03:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: