首页 > 解决方案 > 需要帮助使用 XSLT 在 XML 中查找第一个非空元素

问题描述

XML 元素包含空值和非空值。我需要捕获第一个非空元素。我已经尝试了带有条件的 when/choose 或 if 语句的 for-each 循环,但阅读了其他帖子,似乎在 XSL 中使用 select="" 应该很简单。

当我只想将第一个非空元素及其值返回/分配给我的变量或直接在 XSL HTML 代码中时,带有选择/if 条件语句的 for-each 总是返回多个值。

我也试过按照这个例子做类似的事情: Get the non-empty element using XPATH

但我的变量总是返回“空”。

这是我正在处理的 XML 片段,其中包含 ifid 的空元素值和非空元素值:

<transaction>

<SurePayDetails>
<Subfield>

<ifid></ifid>

</Subfield>
</SurePayDetails>

<SurePayDetails>
<Subfield>

<ifid></ifid>

</Subfield>
</SurePayDetails>
<SurePayDetails>
<Subfield>

<ifid>0022</ifid>
</Subfield>
</SurePayDetails>

</transaction>

我尝试使用以下方法访问/分配第一个非空元素的变量:

<xsl:variable name="auth_code" select="/transaction/SurePayDetails/Subfield/ifid[text()[string-length(.) > 0]][1]"/>

据我了解,它将选择长度大于 0 的第一个 ifid 元素并[1]选择该值。

我不确定我在上面是否正确引用了 XML,select=""因为如果我使用以下内容遍历文档:

`<xsl:for-each select="//ns1:transaction/ns1:SurePayDetails/ns1:Subfield">
.
.
<xsl:variable name="auth_code" select="ns1:ifid"/>`

auth_code 按预期填充了空值和非空值。

谢谢!

标签: xslt

解决方案


您可以使用以下表达式之一。由于运算符优先级,第一部分必须用括号括起来。

<xsl:variable name="auth_code"  select="(/transaction/SurePayDetails/Subfield/ifid[normalize-space(text())])[1]" />

或更短

<xsl:variable name="auth_code"  select="(//ifid[normalize-space(text())])[1]" />

编辑:在添加了命名空间的整个模板中,这可能如下所示:它输出第一个ns1:ifid值。

<xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <xsl:value-of select="(/ns1:transaction/ns1:SurePayDetails/ns1:Subfield/ns1:ifid[normalize-space(text())])[1]" />
    </html>
</xsl:template>

推荐阅读