XML и XSLT: нужно сортировать только определенные дочерние узлы - PullRequest
3 голосов
/ 21 мая 2010

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

<?xml version="1.0"?>
<xmltop>
<child1 num="1">
<data>12345</data>
</child1>

<child1 num="2">
<data>12345</data>
</child1>

<child2 num="3">
<data>12345</data>
</child2>

<child2 num="2">
<data>12345</data>
</child2>

<child2 num="1">
<data>12345</data>
</child2>
</xmltop>

И это XSL-файл, который я использую:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/xmltop">
 <xsl:copy>
  <xsl:apply-templates>
   <xsl:sort select="@num"/>
  </xsl:apply-templates>
 </xsl:copy>
</xsl:template>
<xsl:template match="child2">
 <xsl:copy-of select="."/>
</xsl:template>

</xsl:stylesheet>

Это создает проблемы для меня, потому что узлы лишены своих тегов, а их содержимое остается, что делает мой XML недействительным. Я не специалист в XSL, так что извините, если это глупый вопрос.

<child2> отсортированы правильно.

Спасибо.

1 Ответ

2 голосов
/ 21 мая 2010

Не определено, каким должен быть вывод, поэтому это только я в "режиме угадывания":

<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="xmltop">
  <xsl:copy>
    <xsl:apply-templates>
      <xsl:sort select="(name() = 'child2')*@num"
       data-type="number"/>
    </xsl:apply-templates>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется кXML-документ :

<xmltop>
    <child1 num="1">
        <data>12345</data>
    </child1>
    <child1 num="2">
        <data>12345</data>
    </child1>
    <child2 num="3">
        <data>12345</data>
    </child2>
    <child2 num="2">
        <data>12345</data>
    </child2>
    <child2 num="1">
        <data>12345</data>
    </child2>
</xmltop>

(что я думаю) желаемый результат получен :

<xmltop>
   <child1 num="1">
      <data>12345</data>
   </child1>
   <child1 num="2">
      <data>12345</data>
   </child1>
   <child2 num="1">
      <data>12345</data>
   </child2>
   <child2 num="2">
      <data>12345</data>
   </child2>
   <child2 num="3">
      <data>12345</data>
   </child2>
</xmltop>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...