使用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数据中的第一个标记。
感谢您的回复。
答案 0 :(得分:9)
您无法在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 = ''">
就足够了test="..."
表达式中的XPath选择它 - 任何非空节点集的计算结果为true
<xsl:if>
中的变量)将立即超出范围 (意味着位于</xsl:if>
)。答案 1 :(得分:1)
试试这个
<xsl:variable name="DOC_TYPE">
<xsl:choose>
<xsl:when test="/RootTag"><xsl:value-of select="name(/RootTag/*[1])"></xsl:value-of></xsl:when>
<xsl:otherwise><xsl:value-of select="name(/*[1])"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
答案 2 :(得分:0)
只有在您指定了它之后才存在。没有理由对它进行测试。
另见here