XSLT:使用谓词和 <xsl:if> 语句的区别

XSLT: Difference between using predicates and <xsl:if> statement

我想了解使用谓词和使用 <xsl:if> 之间是否有任何区别?

从性能的角度来看,使用谓词是否更好?谓词是否也遍历xml树中的每个节点,根据过滤条件识别节点?

在 XPath 谓词或 xsl:if(或 xsl:when)测试中放置条件之间的决定实际上是一种风格,而不是性能。

Procedural 代码可以使用循环和 if 语句用 XSLT 编写,但要优雅地利用 XSLT 的强大功能,请基于 XSLT基于其声明式 模式匹配和转换功能。

而不是程序做这个;然后做那个),想想如何通过匹配和转换 声明式 表达输入 XML 和输出 XML 之间的关系 (match输入 XML 并映射到输出 XML 这就是 xs:template 的目的。)谓词可帮助您以声明方式表达模式匹配,因此在按设计使用 XSLT 的方式使用 XSLT 时,谓词优于过程性 xsl:if 语句。

XSLT 和 XQuery 使用 XPath 作为表达式语言,谓词是 XPath 表达式的一部分 https://www.w3.org/TR/xpath-31/#id-filter-expression, an xsl:if is an instruction of the XSLT language https://www.w3.org/TR/xslt-30/#xsl-if

对于您在对 Tim 的评论中提到的示例,我认为大多数人更喜欢使用谓词进行选择和过滤的紧凑 XPath 语法方法,除非您需要使用 [=11 输出节点的位置=] 与所有选定的节点相关,例如<xsl:for-each select="person[name = 'John']"><xsl:value-of select="position()"/></xsl:for-each> 将输出 1,2,3...person 个子元素的 name = 'John' 个元素,而 <xsl:for-each select="person"><xsl:if test="name = 'John'"><xsl:value-of select="position()"/></xsl:if></xsl:for-each> 将输出每个 person 个元素的位置在所有 person 个元素的序列中有一个 name = 'John' 个子元素。

至于性能,我认为您需要检查特定处理器的特定情况,对于声明性语言,处理器可能会选择重写或优化任何代码,只要它产生定义的输出。