在<xsl:sort select =""/>中使用变量

Wil*_*ock 12 xml xslt xpath

您好我建立了一个通用模板来列出我的内容.但是Content可以在不同的@或node()上进行排序.所以想要传递xPath.

<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>
Run Code Online (Sandbox Code Playgroud)

使用变量以升序或降序进入order=""WORKS.

为什么不能这样做select=""呢?

我希望使这个超级动态的select变量可以是xPtah @publish或Title/node()或任何xPath.

没有错误 - 它只是忽略了排序.

Dim*_*hev 14

这是设计的.该select属性是唯一不接受AVT(属性 - 值模板)的属性.

通常的解决方案是使用应该用作排序键的子元素的名称来定义变量.以下是一个小例子:

<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>
Run Code Online (Sandbox Code Playgroud)

将此转换应用于以下XML文档时:

<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>
Run Code Online (Sandbox Code Playgroud)

产生了想要的结果:

<a>
   <b>5</b>
   <c>6</c>
  </a>
<a>
   <b>2</b>
   <c>4</c>
  </a>
<a>
   <b>1</b>
   <c>7</c>
</a>
Run Code Online (Sandbox Code Playgroud)