您好我建立了一个通用模板来列出我的内容。但是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。
没有错误 - 它只是忽略了排序。
这是设计的。该 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>
该 |
(工会经营者)工作......我以前尝试过的时候我一定得错了。这是@Dimitre Novatchev的回答引领我走正路!
以下作品:
<xsl:sort select="@*[name()=$sort] | *[name()=$sort]"
order="{$order}" data-type="text"/>
它允许我对属性和节点进行排序。显然,只要他们没有相同的 name()
但价值观不同。