开发者

Using Variables in <xsl:sort select=""/>

Hi am build a generic template to list my content. But the Content may be sorted on different @'s or node()'s. So want to pass the xPath in.

<xsl:variable name="sort" select="@sortBy"/>
<xsl:variable name="order" select="@order"/>

<xsl:for-each select="Content[@type=$contentType]">
  <xsl:sort select="$sort" order="{$order}" data-type="text"/>
  <xsl:sort select="@update" order="{$order}" data-type="text"/>
    <xsl:copy-of select="."/>
</xsl:for-each>

Using a variable to drop in ascending or descending into the order="" WORKS.

Why cannot do this on the select="" ?

I hoping to make this super dynam开发者_运维知识库ic the select variable can be xPtah either @publish or Title/node() or any xPath.

There is no error - It just ignores the sort.


This is by design. The select attribute is the only one which doesnt accept AVTs (Attribute - Value Templates).

The usual solution is to define a variable with the name of the child element that should be used as sort key. Below is a small example:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vsortKey" select="'b'"/>
 <xsl:variable name="vsortOrder" select="'descending'"/>

 <xsl:template match="/*">
   <xsl:for-each select="*">
    <xsl:sort select="*[name() = $vsortKey]" order="{$vsortOrder}"/>

    <xsl:copy-of select="."/>
   </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

When this transformation is applied on the following XML document:

<t>
  <a>
   <b>2</b>
   <c>4</c>
  </a>
  <a>
   <b>5</b>
   <c>6</c>
  </a>
  <a>
   <b>1</b>
   <c>7</c>
  </a>
</t>

the wanted result is produced:

<a>
   <b>5</b>
   <c>6</c>
  </a>
<a>
   <b>2</b>
   <c>4</c>
  </a>
<a>
   <b>1</b>
   <c>7</c>
</a>


The | (union operator) works... I must have gotten it slightly wrong when tried before. It was @Dimitre Novatchev's answer lead me down the right path!!

The following works:

<xsl:sort select="@*[name()=$sort] | *[name()=$sort]" 
          order="{$order}" data-type="text"/>

It allows me to sort on attributes and nodes. Obviously, as long as they don't have the same name() but different values.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜