#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
что значения не являются числами.