сортировка записей на основе значения поля

#xslt #xml-parsing #xslt-1.0 #xslt-2.0

Вопрос:

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

Ввод XML

 <?xml version="1.0" encoding="UTF-8" ?>
 <root>
  <ID>134</ID>
   <Allocation>9</Allocation>
  <Year>2021</Year>
   <Access>

    <Code>12</Code>
    <PCode>13</PCode>
    <Type>IO</Type>
  </Access>
   <Access>
    
   <Code>15</Code>
    <PCode>16</PCode>
    <Type>IO</Type>
   </Access>

   <Access>
    <Code>19</Code>
    <PCode>20</PCode>
    <Type>MC</Type>
    </Access>
    <Access>
    <Code>22</Code>
    <PCode>25</PCode>
    <Type>MC</Type>
   </Access>
   <Access>
    <Code>30</Code>
    <PCode>31</PCode>
    <Type>IO</Type>
    </Access>
   <Access>
    <Code>35</Code>
    <PCode>36</PCode>
    <Type>IO</Type>
   </Access>
   </root>
 

Код XSLT

 <xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

 <!-- identity transform -->
 <xsl:template match="@*|node()">
    <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
  </xsl:template>

<xsl:template match="root">
<xsl:copy>

<xsl:apply-templates select="Access">
   
        <xsl:sort select="Type" datatype="number"/>
    </xsl:apply-templates>
  
   </xsl:copy>
</xsl:template>

 </xsl:stylesheet>
 

вывод XML

 <?xml version="1.0"?>
 <root>
   <Access>

    <Code>12</Code>
    <PCode>13</PCode>
    <Type>IO</Type>
</Access>
  <Access>
    
   <Code>15</Code>
    <PCode>16</PCode>
    <Type>IO</Type>
</Access>
  <Access>
<Code>30</Code>
    <PCode>31</PCode>
    <Type>IO</Type>
</Access>
  <Access>
   <Code>35</Code>
    <PCode>36</PCode>
    <Type>IO</Type>
</Access>
  <Access>
    <Code>19</Code>
    <PCode>20</PCode>
    <Type>MC</Type>
    </Access>
   <Access>
    <Code>22</Code>
    <PCode>25</PCode>
    <Type>MC</Type>
</Access>
 </root>
 

В приведенных выше выходных полях заголовка xml(идентификатор,Распределение,Год) отсутствуют. Пожалуйста, помогите мне в этом.

Ответ №1:

Как насчет просто:

 <xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/root">
    <xsl:copy>
        <xsl:copy-of select="ID | Allocation | Year"/>
        <xsl:for-each select="Access">
            <xsl:sort select="Type"/>
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
 

Если вы не хотите явно перечислять все остальные элементы, вы можете изменить:

 <xsl:copy-of select="ID | Allocation | Year"/>
 

Для:

 <xsl:copy-of select="*[not(self::Access)]"/>
 

или (в XSLT 2.0), чтобы:

 <xsl:copy-of select="* except Access"/>
 

Обратите внимание, что ваша инструкция:

 <xsl:sort select="Type" datatype="number"/>
 

не имеет смысла, потому Type что значения не являются числами.