使用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>
)。
试试这个
<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>
它只有在你已经指定它的存在。 没有理由以测试它的存在。
另请参见这里