任何人都想过如何对此进行排序?我想在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 #>>
答案 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
)一样,这应该有效。