XSLT如何提取XML中bong节点横杠后最大数值填充到REFERENCE
实现方案
你可以通过排序取首位的方式实现XSLT 1.0下的最大值提取,无需额外扩展函数,修改后的完整代码如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns3="http://NEXSTEP.Schemas.Kasseoppgjor" xmlns:ns2="http://NEXSTEP.Schemas.NexstepTypes" exclude-result-prefixes="ns2 ns3"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/ns3:oppgjor"> <CASH_REGISTER_REPORT> <REFERENCE> <xsl:for-each select="MESSAGE_RECORD/InsertChange/bonger/bong"> <!-- 提取横杠后的数字转数值,按降序排序 --> <xsl:sort select="number(substring-after(., '-'))" data-type="number" order="descending"/> <!-- 取排序后的第一个值即为最大值 --> <xsl:if test="position() = 1"> <xsl:value-of select="substring-after(., '-')"/> </xsl:if> </xsl:for-each> </REFERENCE> </CASH_REGISTER_REPORT> </xsl:template> </xsl:stylesheet>
逻辑说明
- 原有代码中匹配所有元素的通用模板是冗余的,因为根节点匹配模板已经覆盖了全部输出逻辑,直接删除即可
- 通过
substring-after(., '-')提取每个bong节点值中横杠后的部分 - 使用
xsl:sort对提取的数值做降序排序,排序后第一个节点对应的值就是所有数字的最大值
如果你的运行环境支持XSLT 2.0及以上版本,可以用更简洁的写法,直接调用max()函数实现:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns3="http://NEXSTEP.Schemas.Kasseoppgjor" xmlns:ns2="http://NEXSTEP.Schemas.NexstepTypes" exclude-result-prefixes="ns2 ns3"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/ns3:oppgjor"> <CASH_REGISTER_REPORT> <REFERENCE> <xsl:value-of select="max(MESSAGE_RECORD/InsertChange/bonger/bong/number(substring-after(., '-')))"/> </REFERENCE> </CASH_REGISTER_REPORT> </xsl:template> </xsl:stylesheet>
内容的提问来源于stack exchange,提问作者Shanka Somasiri
相关产品推荐
相关产品推荐

