根据字段值排序记录
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
值不是数字。
对于以下基于类型字段的 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
值不是数字。