使用XSLT 1.0,如何检查变量中的值是否存在?
我最初是从XML数据中将值分配给变量,然后需要检查其是否退出:
<xsl:variable name="DOC_TYPE">
<xsl:value-of select="name(./RootTag/*[1])"/>
</xsl:variable>
<xsl:if test="string($DOC_TYPE) = ''">
<xsl:variable name="DOC_TYPE">
<xsl:value-of select="name(./*[1])"/>
</xsl:variable>
</xsl:if>
以上无法正常工作。我需要的是如果我的数据中存在
<RootTag>
,则变量应包含<RootTag>
下的子节点。如果<RootTag>
不存在,则DOC_TYPE应该是我的XML数据中的第一个标记。感谢您的答复。
最佳答案
您无法在XSLT中重新分配变量。变量是不可变的,不能更改其值。曾经
这意味着您必须在变量声明中决定其将具有的值:
<xsl:variable name="DOC_TYPE">
<xsl:choose>
<xsl:when test="RootTag">
<xsl:value-of select="name(RootTag/*[1])" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="name(*[1])" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
其他一些注意事项:
这:
'./RootTag'
是多余的。默认情况下,每个不以斜杠开头的XPath都是相对的,因此说'RootTag'
就足够了这:
<xsl:value-of select="name(*[1])"/>
已经产生了一个字符串(名称是按定义的字符串),因此不需要做<xsl:if test="string($DOC_TYPE) = ''">
,一个简单的<xsl:if test="$DOC_TYPE = ''">
就足够了检查节点是否存在,只需通过XPath在
test="..."
表达式中选择它-任何非空节点集的值都为true
XSLT具有严格的作用域规则。变量仅在其父元素内有效。您的第二个变量(
<xsl:if>
中的一个)将立即超出范围(即在</xsl:if>
处)。