Сортировка XML с помощью XSLT - вся XML-схема неизвестна

Мне интересно, позволяет ли XSLT сортировать XML-файл, если я не знаю всей XML-схемы.

Например, я хотел бы отсортируйте следующий XML-файл.
Сортируйте элементы / CATALOG / CD по / CATALOG / CD / TITLE

<CATALOG attrib1="value1">
  <DVD2>
    <TITLE>The Godfather2</TITLE>
  </DVD2>
  <CD>
    <TITLE>Hide your heart</TITLE>
    <ARTIST>Bonnie Tyler</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>CBS Records</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1988</YEAR>
  </CD>
  <CD attrib4="value4">
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>
      <CATALOG>
        <CD><TITLE>E</TITLE></CD>
        <CD><TITLE>I</TITLE></CD>
        <CD><TITLE>D</TITLE></CD>
      </CATALOG>
    </PRICE>
    <YEAR>1985</YEAR>
  </CD>
  <CD attrib2="value2">
    <TITLE attrib3="value3">Greatest Hits</TITLE>
    <ARTIST>Dolly Parton</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>RCA</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1982</YEAR>
  </CD>
  <DVD>
    <TITLE>The Godfather1</TITLE>
  </DVD>
</CATALOG>

Результат должен быть:

<CATALOG attrib1="value1">
  <CD attrib4="value4">
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>
      <CATALOG>
        <CD><TITLE>E</TITLE></CD>
        <CD><TITLE>I</TITLE></CD>
        <CD><TITLE>D</TITLE></CD>
      </CATALOG>
    </PRICE>
    <YEAR>1985</YEAR>
  </CD>
  <CD attrib2="value2">
    <TITLE attrib3="value3">Greatest Hits</TITLE>
    <ARTIST>Dolly Parton</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>RCA</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1982</YEAR>
  </CD>
  <CD>
    <TITLE>Hide your heart</TITLE>
    <ARTIST>Bonnie Tyler</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>CBS Records</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1988</YEAR>
  </CD>
  <DVD2>
    <TITLE>The Godfather2</TITLE>
  </DVD2>
  <DVD>
    <TITLE>The Godfather1</TITLE>
  </DVD>
</CATALOG>

Это одна из многих моих попыток:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <!--<CATALOG>-->
    <xsl:for-each select="CATALOG/CD">
      <xsl:sort select="TITLE" />
      <xsl:copy-of select="."/>
    </xsl:for-each>
    <!--</CATALOG>-->
  </xsl:template>
</xsl:stylesheet>

Проблема в что при использовании этого XSLT части XML вне списка компакт-дисков не отображаются.
Я мог бы раскомментировать две закомментированные части кода, но именно этого я хочу избежать.
В этом случае, если какие-либо атрибуты добавлены к элементу CATALOG, они не будут скопированы в выходной XML.
Я не хочу перестраивать XML-файл: я просто хочу выполнить сортировку, зная точную информацию только о некоторой части XML-схемы.

Эту функциональность легко реализовать, например, с помощью .NET (с XmlDocument и XmlNode) или библиотеки Python lxmx, но возможно ли это с XSLT?

Спасибо!

Примечание: нелегко найти образец входного XML, который во всех случаях позволит избежать неправильного понимания вопроса. Но я постараюсь подробно описать проблему, насколько смогу:

  • должны быть отсортированы только элементы компакт-диска прямо в КАТАЛОГЕ (например, элементы компакт-диска в разделе Боба Дилана должны оставаться нетронутыми)
  • все равно, будет ли элементы, отличные от CD (например, DVD и DVD2), находятся в начале или конце списка
  • без элементов, атрибутов, значений, комментариев, поэтому ничего не должно отсутствовать в выходных XML
  • элементах, не относящихся к CD (для пример DVD и DVD2) не следует сортировать по подэлементу TITLE
7
задан user834929 16 July 2011 в 20:53
поделиться