需要帮助,使用XSLT查找XML中的第一个非空元素

时间:2019-04-22 18:19:41

标签: xslt

XML元素同时包含空值和非空值。我需要捕获第一个非空元素。我已经尝试了使用条件条件when / choose或if语句但阅读其他文章的for-each循环,看来在XSL中使用select =“”应该很简单。

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

我也尝试按照以下示例进行类似操作: 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]选择该值。

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

<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>