在XSLT中,<xsl:if test =“。[foo或@bar]”>是什么意思,什么是跨浏览器解决方案?</xsl:if>

时间:2012-04-06 08:53:53

标签: xslt cross-browser

XSL:

<xsl:if test=".[foo or @bar]">
    something
</xsl:if>
  1. 是否测试目标是否为'foo'标记名称或具有'bar'属性?

  2. 它仅适用于IE,我想知道是否有错误。什么是等效句子,但跨浏览器工作?

3 个答案:

答案 0 :(得分:2)

XSLT 1.0中不允许使用语法.[x]。在XSLT 1.0的早期草案中允许它,我怀疑它是由于监督而不是故意设计决定而在最终版本中缺席(并且已经说过,它已在XSLT 2.0中恢复)。因为IE在1.0规范最终确定之前首次发布了它的XSLT处理器,所以它们可能支持这种语法,以便与这些早期草稿向后兼容。

答案 1 :(得分:0)

它测试当前节点是否具有名为foo的子元素或具有名为bar的属性。也就是说,如果将其更改为

<xsl:if test="foo or @bar">

您使用的语法在我的xsl解析器中被拒绝:Invalid XPath expression Unexpected token - "[foo or @bar]"

我使用的那个应该跨浏览器工作 如果您希望选择名称为foobar属性的节点,请使用以下内容:

<xsl:if test="name()='foo' or @bar">

答案 2 :(得分:0)

<xsl:if test=".[foo or @bar]">     
  something 
</xsl:if>

在XSLT 1.0中,这在语法上无效并产生错误

在XSLT 2.0中,这相当于

 <xsl:if test="foo or @bar">     
   something 
 </xsl:if>

表达式

foo or @bar
当上下文节点(当前节点)具有名为true() 的子元素时,

准确评估到foo上下文节点具有名为bar的属性(或两者兼而有之。)

否则此表达式的计算结果为false()

因此,上面的代码段表示:如果满足以下任一条件:当前节点有一个名为foo的子元素,或者当前节点有一个名为bar的属性 - 然后输出字符串“something”