由于我关心与IsItemOfType()函数有关的性能问题(在这里阅读更多),我试图使用GetItemsOfType()函数重写它。
下面是代码:
<xsl:variable name="home" select="ancestor-or-self::item[sc:IsItemOfType('_MenuRoot',.)]"></xsl:variable>
<xsl:variable name="home2" select="sc:GetItemsOfType('_MenuRoot', ./ancestor-or-self::item)"></xsl:variable>
<div>
<xsl:value-of select="count($home/item)" /> <!-- returns 4 -->
<br />
<xsl:value-of select="count($home2/item)" /> <!-- returns 0 ??? -->
<br />
</div>
不幸的是GetItemsOfType()函数不返回带有子条目?知道为什么吗?
似乎GetItemsOfType()只查看从项目的当前模板继承的模板。所以如果item1是模板t1的,而t1继承自t2,它只会返回item1,如果你问它是否继承自t2而不是t1。
你可以自己编码。这并不难。你可以这样做:
public bool InheritsFrom(Item item, ID templateIdToTest)
{
Template template = TemplateManager.GetTemplate(item);
if (template.ID == templateIdToTest)
return true;
return template.DescendsFrom(templateIdToTest);
}