我知道,一般来说,如果和选择陈述应该避免依赖于模式匹配然而我发现自己处于必须使用其中一种情况的情况(这是由于我需要排序)。
无论如何,我可以使用两个<xsl:if />
语句或一个空白<xsl:choose />
的{{1}}语句。我想知道哪一种更有效率。
这是一些虚拟代码:
XML
<otherwise />
XSLT 1
<?xml version="1.0" encoding="utf-8"?>
<news>
<newsItem id="1">
<title>Title 1</title>
</newsItem>
<newsItem id="2">
<title>Title 2</title>
</newsItem>
<newsItem id="3">
<title></title>
</newsItem>
<newsItem id="4">
<title>Title 4</title>
</newsItem>
<newsItem id="5">
<title>Title 5</title>
</newsItem>
<newsItem id="6">
<title>Title 6</title>
</newsItem>
</news>
XSLT 2
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<ol>
<xsl:apply-templates select="/news/newsItem [string(title)]">
<xsl:sort order="descending" data-type="number" select="@id"/>
</xsl:apply-templates>
</ol>
</xsl:template>
<xsl:template match="newsItem">
<xsl:if test="position() < 5">
<li>
<xsl:value-of select="title"/>
<xsl:if test="position() < 2"> less than two</xsl:if>
<xsl:if test="position() = 3"> equals 3</xsl:if>
</li>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
感谢您的帮助!
答案 0 :(得分:3)
在这种情况下,它实际上并没有太大的区别。你的第二次“何时”测试只比你的第一次执行时间短。
那就是说,如果你从不期望也不想要这两个条件都是真的,我会使用选择/何时/解决方案。知道只有一个条件是正确的,测试这两个条件似乎不合逻辑,但根据被测试的因素,这将是不可避免的。
当然,“选择”的好处是您可以轻松设置后备选项,但您没有利用此功能。并不是说它会有很大的不同,但只要两个条件返回false就会执行这个“其他”行,即使它什么都不包含。
如果您使用其他语言(如JavaScript)执行此条件语句,您可能不会再考虑使用if / else if / else解决方案 - 再次,因为您只希望一个条件永远为真。
我害怕使用'select'而不是'if'是有条件的,这完全取决于你正在处理的数据和你正在测试的数据。
这可能在某种程度上有用,另一个开发人员的观点:http://xsltbyexample.blogspot.com/2008/02/when-to-use-xslif-and-xslwhen.html
答案 1 :(得分:2)
当我在很久以前看过这篇文章时,我能找到的唯一指导就是这篇知识库文章:
INFO: Techniques to Improve Performance of XSL Transformations
减少使用量 XSL:选择/ XSL:当/ XSL:不然。 当性能受到影响时[原文如此] 大多数选择都落空了 否则条款。因此,匹配 与何时,并尽量避免使用 否则,当你知道一个 存在特殊价值。
但我猜它会依赖于你正在使用的XSLT处理器。
答案 2 :(得分:1)
它可能没有显着区别,但在具有两个if
测试的版本中,两个XPath条件总是被执行,而在choose
情况下,如果第一个if
匹配,第二个永远不会被执行。
Stylus Studio,Oxygen等都有测量这种东西的分析器,因为像大多数优化一样,通常最好测量并实际看到,而不是尝试通过感觉来做。而特定的XSLT引擎将在这里产生巨大的变化。
答案 3 :(得分:1)
不太可能有所作为。如果是这样,差异将完全取决于您使用的XSLT处理器。性能问题的答案总是:“衡量它!”。