Сортировка таймкодов в XLST

У кого-нибудь есть мысли о том, как я могу это отсортировать? Я хочу сортировать по возрастанию значений тайм-кода в моем xlst, но я не думаю, что типичная сортировка будет правильно читать значения тайм-кода.

Моя конечная цель: 1) Отсортировать узлы по возрастанию значений тайм-кода 2) Выбрать значение тайм-кода первой итерации соответствующего цвета, затем второй, затем третьей и т. д.

Пожалуйста, дайте мне знать, если мне нужно уточнить больше.

Вот XML:

<Metadata>
   <Locator>
   <Label>OUT</Label>
   <Color>Blue</Color>
   <Timecode>00;13;28;26</Timecode>
   <Username>bpayne</Username>
   <Track>V1</Track>
</Locator>
   <Locator>
   <Label>OUT</Label>
   <Color>Magenta</Color>
   <Timecode>00;15;29;26</Timecode>
   <Username>bpayne</Username>
   <Track>V1</Track>
   </Locator>
<Locator>
   <Label>IN</Label>
   <Color>Magenta</Color>
   <Timecode>00;23;48;19</Timecode>
   <Username>bpayne</Username>
   <Track>V1</Track>
</Locator>
<Locator>
   <Label>IN</Label>
   <Color>Magenta</Color>
   <Timecode>00;03;15;13</Timecode>
   <Username>bpayne</Username>
   <Track>V1</Track>
</Locator>
<Locator>
   <Label>OUT</Label>
   <Color>Magenta</Color>
   <Timecode>00;19;50;25</Timecode>
   <Username>bpayne</Username>
   <Track>V1</Track>
</Locator>
<Locator>
   <Label>IN</Label>
   <Color>Magenta</Color>
   <Timecode>00;25;58;05</Timecode>
   <Username>bpayne</Username>
   <Track>V1</Track>
</Locator>
<Locator>
   <Label>IN</Label>
   <Color>Magenta</Color>
   <Timecode>00;07;44;29</Timecode>
   <Username>bpayne</Username>
   <Track>V1</Track>
</Locator>
<Locator>
   <Label>OUT</Label>
   <Color>Magenta</Color>
   <Timecode>00;09;05;28</Timecode>
   <Username>bpayne</Username>
   <Track>V1</Track>
</Locator>
<Locator>
   <Label>IN</Label>
   <Color>Blue</Color>
   <Timecode>00;02;19;23</Timecode>
   <Username>bpayne</Username>
   <Track>V1</Track>
</Locator>
<Locator>
<Label>OUT</Label>
   <Color>Magenta</Color>
   <Timecode>00;13;16;11</Timecode>
   <Username>bpayne</Username>
   <Track>V1</Track>
</Locator>
<Locator>
    <Label>OUT</Label>
    <Color>Blue</Color>
    <Timecode>00;02;31;23</Timecode>
    <Username>bpayne</Username>
    <Track>V1</Track>
</Locator>

А вот часть XLST, которую я использую. Мне нужно сначала отсортировать узлы по значению временного кода, а затем преобразовать его с помощью этого XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="/">
        <TimeCodes>
            <G1_TC_1_IN>
                <xsl:choose>
                    <xsl:when test="Metadata/Locator[Color = 'Magenta'][1]">
                        <xsl:value-of select="concat(
                        substring-before(Metadata/Locator[Color = 'Magenta'][1]/Timecode, ';'), ':',
                        substring-before(substring-after(Metadata/Locator[Color = 'Magenta'][1]/Timecode, ';'), ';'), ':',
                        substring-after(substring-after(Metadata/Locator[Color = 'Magenta'][1]/Timecode, ';'), ';')
                        )"/>
                    </xsl:when>       
                    <xsl:otherwise>18:00:00;00</xsl:otherwise>
                </xsl:choose>
                <xsl:text>@29.97</xsl:text>
            </G1_TC_1_IN>
            <G1_TC_1_OUT>
                <xsl:choose>
                    <xsl:when test="Metadata/Locator[Color = 'Magenta'][2]">
                        <xsl:value-of select="concat(
                            substring-before(Metadata/Locator[Color = 'Magenta'][2]/Timecode, ';'), ':',
                            substring-before(substring-after(Metadata/Locator[Color = 'Magenta'][2]/Timecode, ';'), ';'), ':',
                            substring-after(substring-after(Metadata/Locator[Color = 'Magenta'][2]/Timecode, ';'), ';')
                            )"/>
                    </xsl:when>       
                    <xsl:otherwise>18:00:00;00</xsl:otherwise>
                </xsl:choose>
                <xsl:text>@29.97</xsl:text>
            </G1_TC_1_OUT>
........

<G2_TC_1_IN>
                <xsl:choose>
                    <xsl:when test="Metadata/Locator[Color = 'Blue'][1]">
                        <xsl:value-of select="concat(
                            substring-before(Metadata/Locator[Color = 'Blue'][1]/Timecode, ';'), ':',
                            substring-before(substring-after(Metadata/Locator[Color = 'Blue'][1]/Timecode, ';'), ';'), ':',
                            substring-after(substring-after(Metadata/Locator[Color = 'Blue'][1]/Timecode, ';'), ';')
                            )"/>
                    </xsl:when>       
                    <xsl:otherwise>18:00:00;00</xsl:otherwise>
                </xsl:choose>
                <xsl:text>@29.97</xsl:text>
            </G2_TC_1_IN>

person Ryan Jensen    schedule 03.11.2015    source источник
comment
Вы говорите о сортировке, но я не вижу xsl:sort в вашем коде. Можете ли вы опубликовать результат, который вы хотите создать для опубликованного ввода XML?   -  person Martin Honnen    schedule 03.11.2015


Ответы (1)


Для сортировки вы можете использовать apply-templates с вложенным sort, например.

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

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

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

    <xsl:template match="Metadata">
        <xsl:copy>
            <xsl:apply-templates select="Locator">
                <xsl:sort select="Timecode"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:transform>

В Интернете по адресу http://xsltransform.net/bFN1y8X. Это должно работать до тех пор, пока все числовые значения, разделенные запятой, состоят из двух цифр, как ваши значения (00;02;31;23).

person Martin Honnen    schedule 03.11.2015