xslt 1.0 previous-sibling for sorted group

时间:2011-04-15 00:10:37

标签: sorting xslt-1.0

我需要根据排序组中的前一个兄弟来运行条件操作。我知道previous-sibling函数作用于原始文档,而不是排序结果。有没有办法对排序结果列表进行操作?我不认为muenchian分组方法是我需要的,因为我不想基于前面的兄弟分组。

鉴于下面的xml,我想按容器的值排序,然后测试以查看previous-sibling的type属性(在排序结果中)是否不同,如果是,我需要输出值新的@type,但我不希望结果按@type排序。

XML

<c>
     <did>
        <container id="cid1059023" type="Box">C 3</container>
        <container id="cid1059004" type="Map-case">C 1</container>
        <container id="cid1059002" type="Binder">OSxxx-3</container>
        <container id="cid1059042" type="Box">OSxxx-1</container>
     </did>
 </c>
<c>
     <did>
        <container id="cid1059025" type="Box">C 4</container>
        <container id="cid1059006" type="Map-case">C 2</container>
     </did>
 </c>

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" version="1.0">
    <xsl:template match="/">
        <table>
            <xsl:for-each select="child::*/container[@id]">
                <xsl:sort select="."/>
                <tr>
                   <td class="container">
                       <xsl:if test="@type != preceding-sibling::*/@type">
                           <xsl:value-of select="@type"/>
                       </xsl:if>
                       <xsl:value-of select="."/>
                    </td>
                </tr>
            </xsl:for-each> 
        </table>
    </xsl:template>
</xsl:stylesheet>

感谢。

1 个答案:

答案 0 :(得分:0)

我不知道如何在不使用扩展程序的情况下使用XSLT 1.0执行此操作。所以我要么使用XSLT 2.0,要么如果你有一个用枪指着你的人喊着你应该使用XSLT 1.0 ,那么你可以创建一个带有两个XSLT步骤的管道,在一个第一步,过滤一秒。