要求以正确的方式确认

时间:2016-01-13 03:54:06

标签: xml xslt

我在XSLT中有一个问题。我通常会执行以下操作来检查xml文档的变量/节点的非无效性

<Blocks>
   <Block ID="1"/>
   <Block ID="2"/>
   <Block ID="3"/>
 </Blocks>

 <xsl:variable name="var1" select="Blocks/Block[@ID = 1]"/>
 <xsl:if test="$var1 != ''">
   <output>True</output>
 </xsl:if>

我公司的人说$var1 != ''不能始终如一地工作(有时候是工作,有时候不工作)而不是使用这些东西(但是使用test="$var1")。如果这是正确的,则需要确认并使用$var1 != ''

1 个答案:

答案 0 :(得分:0)

如果要检查的是元素是否具有文本值,例如要防止空<Block />元素,我倾向于使用text()函数而不是字符串比较:

<xsl:if test="Blocks/Block[@ID = 1]/text()">
   <output>True</output>
</xsl:if>

此表达式检查文本节点是否存在。相反,字符串比较(= '')从元素的文本节点中提取字符串,并检查它是否等于''。从理论上讲,后者的效率低于前者,即使结果相同。

(尽管如此,XSLT处理器和XPath引擎可能已经实现了空字符串比较的优化)。

注意:如果您想指示XSLT忽略 无关紧要的空格,并且只保留包含非空白元素的文本节点(以及{{3中定义的其他条件)您可以将<xsl:strip-space />指令与<xsl:strip-space elements="*"/>

之类的配置一起使用

这将保护您的表达式免受仅包含回车符,换行符,制表符和空格的元素的影响(#x20,#x9,#xD或#xA实体)。