根据字段值排序记录

sorting records based on field value

对于以下基于类型字段的 XML 输入,我们正在进行排序,并且它按预期使用以下 XSLT 代码工作..但输出中缺少 header 信息 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 header 字段(ID、分配、年份)缺失。请帮我解决这个问题。

怎么样:

<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 值不是数字。