3 xslt
使用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>
Run Code Online (Sandbox Code Playgroud)
以上不符合预期.我需要的是,如果<RootTag>我的数据中存在,那么变量应该包含下面的子节点<RootTag>.如果<RootTag>不存在则DOC_TYPE应该是我的XML数据中的第一个Tag.
感谢您的答复.
您无法在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>
Run Code Online (Sandbox Code Playgroud)
其他几点说明:
'./RootTag'多余的.默认情况下,每个不以斜杠开头的XPath都是相对的,所以说'RootTag'就够了<xsl:value-of select="name(*[1])"/>已经产生一个字符串(名称是字符串的定义),所以没有必要这么做<xsl:if test="string($DOC_TYPE) = ''">,一个简单的<xsl:if test="$DOC_TYPE = ''">就足够了test="..."表达式中的XPath选择它- 任何非空节点集的计算结果为true<xsl:if>)将立即超出范围(意味着在该范围内</xsl:if>).