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填充了预期的空值和非空值。
谢谢!
答案 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>