测试XSLT/XPath是否为空值

6

我有以下的代码,它会检查xml中是否存在一个字符串... 但是,我需要创建另一个测试来检查第一行的变量$validItems是否为'Null'或没有文本...

<xsl:if test="$validItems[(Caption | CalltoAction)[string(.)]]">
 <div class="text">
   <xsl:choose>
     <xsl:when test="$horizontal">
       <div class="holder">
         <div class="frame">
           <div class="slides-descriptions">
             <xsl:apply-templates select="$validItems" mode="horizontal"/>
           </div>
           <div class="switcher"/>
         </div>
       </div>
     </xsl:when>
     <xsl:otherwise>
       <div class="slides-descriptions">
         <xsl:apply-templates select="$validItems" mode="vertical"/>
       </div>
       <div class="switcher"/>
     </xsl:otherwise>
   </xsl:choose>
 </div>
</xsl:if>

我该如何测试变量xsl:if test=$validItems?

2
你尝试过使用 xsl:if test="not($validItems)" 或阅读 http://www.w3.org/TR/xpath/#section-Boolean-Functions 吗? - Istao
1
不清楚你想做什么。“另一个测试,检查变量$validItems中的'Null'或无文本” - 你想检查$validItems中的任何元素是否具有CaptionCalltoAction子元素,其文本值为空字符串吗?顺便说一下,在XSLT中并没有真正的“null”,只有空字符串/节点集/序列。 - LarsH
我想在$validItems中查找Caption | CalltoAction中没有文本的内容。如果没有找到文本,则需要xsl:otherwise条件。我只是寻找如何过滤字符串中没有文本的方法。 - MizAkita
3个回答

7
如果我理解你的问题,
<xsl:if test="$validItems[(Caption | CalltoAction)[not(string(.))]]">

将会执行此操作。换句话说,如果$validItems节点集中有一个元素,该元素具有Caption或CalltoAction子元素且其字符串值为空。你也可以这样说

<xsl:if test="$validItems[(Caption | CalltoAction)[. = '']]">

1
谢谢LarsH...就是这样了![not(string(.))] - MizAkita

6
在XPath数据模型中,不存在“Null”这样的东西。
至于“$validItems变量内没有文本”的情况,了解该变量的类型会有所帮助。如果它是单个元素节点(从您展示的代码示例中可能看出),并且您想测试的是它是否没有文本节点子级,则测试将为not($ValidItems/text())。如果您想测试它是否没有文本节点后代,请尝试not(string($validItems))或等效地,$validItems=''

0

这些答案对我都没有用,我不知道是不是因为我正在使用ODK xforms的xpath。但我已经通过以下解决方案使其工作:

string-length(string(/path/to/node)) = 0

我已经在日期和数字上测试过这个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接