Using Variables in

2019-02-12 05:25发布

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 dynamic the select variable can be xPtah either @publish or Title/node() or any xPath.

There is no error - It just ignores the sort.

标签: xml xslt xpath
2条回答
孤傲高冷的网名
2楼-- · 2019-02-12 05:34

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.

查看更多
淡お忘
3楼-- · 2019-02-12 05:37

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>
查看更多
登录 后发表回答