我在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 != ''
。
答案 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实体)。