使用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>处)。

09-11 09:06