Сортировка по возрастанию/убыванию

Alexandre

PHPПенсионер
Сортировка по возрастанию/убыванию

если мой шаблон делает сортировку по возрастанию-убыванию, то мы делаем:
PHP:
<xsl:for-each select="$allprj ">
			
	<xsl:sort select="priority[//root/@sort='priority' ]" data-type="text" order="descending"/>
.....
</xsl:for-each>
кто знает способ КАК СДЕЛАТЬ СОРТИРОВКУ не только по возрастанию (или убыванию), а чтоб она могла зависить от xml параметра, например < root @order=" [ asc | dsc ] " >....
 

Miky

Guest
Re: Сортировка по возрастанию/убыванию

Автор оригинала: Alexandre
если мой шаблон делает сортировку по возрастанию-убыванию, то мы делаем:
PHP:
<xsl:for-each select="$allprj ">
			
	<xsl:sort select="priority[//root/@sort='priority' ]" data-type="text" order="descending"/>
.....
</xsl:for-each>
кто знает способ КАК СДЕЛАТЬ СОРТИРОВКУ не только по возрастанию (или убыванию), а чтоб она могла зависить от xml параметра, например < root @order=" [ asc | dsc ] " >....
Попробуй так:
PHP:
<xsl:for-each select="$allprj">
	<xsl:choose>
	<xsl:when test="@order='dsc'">
		<xsl:sort select="priority[//root/@sort='priority' ]" data-type="text" order="descending"/>
	</xsl:when>
	<xsl:_otherwise>
		<xsl:sort select="priority[//root/@sort='priority' ]" data-type="text" order="ascending"/>
	</xsl:_otherwise>
	.....
</xsl:for-each>
 

Alexandre

PHPПенсионер
уже пробовал:
Ошибка
'xsl:sort' не может быть дочерним элементом элемента 'xsl:when'.



'xsl:sort' может быть только дочерним элементом xsl:apply-templates или xsl:for-each не хотелось бы писать ради этого отдельный шаблон
 

Miky

Guest
Тогда разводи выше xsl:for-each, а после xsl:sort вызывай общий шаблон.
 

jian

Guest
Miky imeet v vidu sleduyushee:

Код:
<xsl:choose> 
        <xsl:when test="@order='dsc'"> 
                <xsl:for-each select="$allprj"> 
                        <xsl:sort select="priority[//root/@sort='priority' ]" data-type="text" order="descending"/> 
                </xsl:for-each>
        </xsl:when> 
        <xsl:_otherwise> 
                <xsl:for-each select="$allprj"> 
                        <xsl:sort select="priority[//root/@sort='priority' ]" data-type="text" order="ascending"/> 
                </xsl:for-each>
        </xsl:_otherwise> 
</xsl:choose>
 

Alexandre

PHPПенсионер
jian ты представляешь, что после строки
Код:
<xsl:sort select="priority[//root/@sort='priority' ]" data-type="text" order="...."/>
мне придется дважды повторить кусок текста из 30 - 40 строк. Где рациональность?
 

jian

Guest
Код:
<xsl:template match="blah/blah">

	...

	<xsl:choose> 
	        <xsl:when test="@order='dsc'"> 
	                <xsl:for-each select="$allprj"> 
	                        <xsl:sort select="priority[//root/@sort='priority' ]" data-type="text" order="descending"/> 
	                        <xsl:call-template name="vot_racionalnost"/>
	                </xsl:for-each>
	        </xsl:when> 
	        <xsl:_otherwise> 
	                <xsl:for-each select="$allprj"> 
	                        <xsl:sort select="priority[//root/@sort='priority' ]" data-type="text" order="ascending"/> 
	                        <xsl:call-template name="vot_racionalnost"/>
	                </xsl:for-each>
	        </xsl:_otherwise> 
	</xsl:choose> 

	...

</xsl:template>


<xsl:template name="vot_racionalnost">
        кусок текста из 30 - 40 строк. 
</xsl:template>
 

Alexandre

PHPПенсионер
jian обломно было, но перенес, спасибо,
только в
PHP:
<xsl:when test="@order='dsc'">
контекстный узел другой, пришлось написать
PHP:
<xsl:when test="//root[@order='descending']">
-~{}~ 09.09.04 12:26:

Вот результат :
PHP:
		<xsl:variable name="prj" select="root/projects[status != '3' or not(status) ]"  /> 
		<xsl:variable name="allprj" select="root[not(action/@mode )]/projects"  /> 
		<xsl:variable name="curprj" select="root[action/@mode ='curent']/projects[status = '3']"  /> 

		<xsl:choose> 
	        <xsl:when test="//root[@order='ascending']"> 
	                <xsl:for-each select="$allprj | $prj | $curprj"> 
						<xsl:sort select="employee/name[//root/@sort='managername' ]" data-type="text" order="ascending"/>
						<xsl:sort select="priority[//root/@sort='priority' ]" data-type="text" order="ascending"/> 
						<xsl:sort select="name[//root/@sort='name' ]" data-type="text" order="ascending"/>
						<xsl:sort select="employee/category/name[//root/@sort='category' ]" data-type="text" order="ascending"/>
						<xsl:sort select="status[//root/action/@mode='curent' ]" data-type="text" order="descending"/>	
	                        
	                        <xsl:call-template name="all_table"/>
	                </xsl:for-each>
	        </xsl:when> 
	        
	        <xsl:when test="//root[@order='descending']"> 
	                <xsl:for-each select="$allprj | $prj | $curprj"> 
						<xsl:sort select="employee/name[//root/@sort='managername' ]" data-type="text" order="descending"/>
						<xsl:sort select="priority[//root/@sort='priority' ]" data-type="text" order="descending"/> 
						<xsl:sort select="name[//root/@sort='name' ]" data-type="text" order="descending"/>
						<xsl:sort select="employee/category/name[//root/@sort='category' ]" data-type="text" order="descending"/>
						<xsl:sort select="status[//root/action/@mode='curent' ]" data-type="text" order="descending"/>	

	                        <xsl:call-template name="all_table"/>
	                </xsl:for-each>
	        </xsl:when> 
	</xsl:choose>
Шаблон самой таблице приводить не буду
я ошибся - там 60 строк
 
Сверху