在XLST中对时间码进行排序

时间:2015-11-03 15:09:47

标签: xml sorting xslt timecodes

任何人都想过如何对此进行排序?我想在xlst中按升序时间码值排序,但我不认为典型的排序会正确读取时间码值。

我的最终目标是1)按时间码值升序对节点排序2)选择相应颜色的第一次迭代的时间码值,然后选择第二次,然后是第三次,等等。

如果我需要澄清更多内容,请告诉我。

这是XML:

    <?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>

这是我正在使用的XLST的一部分。我需要先按时间码值对节点进行排序,然后使用此XSLT对其进行转换:

GenericTextFormatter<<#=type #>>

1 个答案:

答案 0 :(得分:0)

要进行排序,您可以将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)一样,这应该有效。