【问题标题】:XSLT: Difference between using predicates and <xsl:if> statementXSLT:使用谓词和 <xsl:if> 语句之间的区别
【发布时间】:2018-07-12 06:33:13
【问题描述】:

我想了解使用谓词和使用&lt;xsl:if&gt; 之间是否有任何区别?

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

【问题讨论】:

  • 您能否澄清一下在这种情况下谓词的实际含义,因为将谓词与xsl:if 进行比较没有意义。谓词是转换为真或假的表达式值,xsl:if 将在其test 表达式中使用谓词。谢谢。
  • 假设我想根据 Name='John' 进行过滤。我可以使用谓词来做到这一点,比如 [name='John'] 或者我可以使用 来做到这一点。在这种情况下,哪种方法更好?

标签: xml xslt xpath predicates


【解决方案1】:

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

过程代码可以使用循环和 if 语句在 XSLT 中编写,但要优雅地利用 XSLT 的强大功能,请将您的 XSLT 建立在其 声明性 模式匹配和转换功能。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      相关资源
      最近更新 更多