问题 在中使用变量


您好我建立了一个通用模板来列出我的内容。但是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>

使用变量以升序或降序进入 order="" 作品。

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

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

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


9896
2018-02-24 19:35


起源

W3c规范说; xsl:sort有一个select属性,其值是一个表达式。和表达被称为;表达式作为XSLT定义的元素和大括号内的某些属性的值出现当我添加大括号时,我得到一个XSLT编译错误...:{ - Will Hancock
好问题(+1)。看下面的答案:) - Dimitre Novatchev


答案:


这是设计的。该 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>

将此转换应用于以下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>

产生了想要的结果

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

14
2018-02-24 19:50



嗯,是的,我看到我试过......除了; <xsl:sort select =“@ [name()= $ vsortKey]“order =”{$ vsortOrder}“/>事情是我需要按@attribute或child :: - Will Hancock


| (工会经营者)工作......我以前尝试过的时候我一定得错了。这是@Dimitre Novatchev的回答引领我走正路!

以下作品:

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

它允许我对属性和节点进行排序。显然,只要他们没有相同的 name() 但价值观不同。


0
2018-02-24 20:26



@Will:除非您发布实际答案,否则请不要发布到页面的下半部分。 StackOverflow不像经典论坛。谢谢。 ;) - Tomalak
不是......说这是anser,对不起有点困惑。 - Will Hancock
@Will Hancock:很高兴这个答案很有用。你甚至可以考虑接受它:) - Dimitre Novatchev
哈哈@DimitreNovatchev #MyBad - Will Hancock