xslt - 需要帮助使用 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 按预期填充了空值和非空值。
谢谢!
解决方案
您可以使用以下表达式之一。由于运算符优先级,第一部分必须用括号括起来。
<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>
推荐阅读
- c - 用C中的数字对填充数组
- python - 如何导入差异。python中的嵌套文件夹文件
- eclipse - 跟踪从我自己的类创建的对象
- excel - 跳过类型不匹配
- redirect - HTTP2 请求不遵循 JMeter 5.0 中的重定向
- javascript - 将 javascript 中的数据源发送到 mySQL 数据库
- nlp - Dialogflow 中的组参数
- c# - 在 ASP.net 中使用 Office 365 作为中继时如何将发件人(代表用户)添加到电子邮件
- ios - Swift:使用 Dictionary 将 JSON 数据从 alamofire 解析为数组时出错
- eucalyptus - Eucalyptus 4.4.4 Eucaconsole 登录后崩溃