Сортировка временных кодов в 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>
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
).