xslt 1.0 предшествующий брат для отсортированной группы

Мне нужно выполнить условное действие на основе предыдущего брата в отсортированной группе. Я знаю, что функция previous-sibling действует на исходный документ, а не на отсортированные результаты. Есть ли способ работать с отсортированным списком результатов? Я не думаю, что мюнхийский метод группировки - это то, что мне нужно, потому что я не хочу группировать на основе предыдущего брата.

Учитывая приведенный ниже xml, я хочу отсортировать по значению контейнера, а затем проверить, отличается ли атрибут типа предыдущего брата (в отсортированных результатах), если мне нужно вывести значение нового @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>

Спасибо.


person Winona    schedule 15.04.2011    source источник


Ответы (1)


Я не понимаю, как это можно сделать с XSLT 1.0 без использования расширения. Поэтому я бы либо использовал XSLT 2.0, либо, если у вас есть кто-то, нацеленный на вас и кричащий , вы должны использовать XSLT 1.0, тогда вы могли бы создать конвейер с двумя шагами XSLT, выполнить сортировку в первый шаг и фильтрация на втором.

person avernet    schedule 15.04.2011
comment
Спасибо всем, у меня было ощущение, что это невозможно с xslt 1.0, к сожалению, я не могу использовать xslt 2.0 или расширения, так как я не могу изменить среду обработки. Мы просто обойдемся без. - person Winona; 15.04.2011