XSLT匹配MultiplierFactorNumeric小数与Note文本提取对应内容
XSLT 折扣比例匹配对应Note标注实现方案
核心实现思路
- 先将
cbc:MultiplierFactorNumeric的百分比小数值乘以100后,格式化为3位长度、前位补零的数字编码,例如0.05转换为005 - 在同层级的
cbc:Note节点中查找包含上述3位编码、且符合[前缀]_[编码]_[目标文本]格式的节点 - 截取编码后下划线拼接的文本段,和百分比数值一同输出
可直接复用的代码
替换你原有的for-each循环块即可:
<xsl:for-each select="./cac:AllowanceCharge/cbc:MultiplierFactorNumeric"> <br/> <!-- 生成3位补零的匹配编码 --> <xsl:variable name="matchCode" select="format-number(. * 100, '000')"/> <!-- 查找匹配编码的Note节点 --> <xsl:variable name="matchedNote" select="../../cbc:Note[contains(., concat('_', $matchCode, '_'))][1]"/> <xsl:text> %</xsl:text> <xsl:value-of select="format-number(. * 100, '###.##0,00', 'european')"/> <!-- 匹配成功时输出对应标注文本 --> <xsl:if test="$matchedNote"> <xsl:text> 对应标注:</xsl:text> <xsl:value-of select="substring-after($matchedNote, concat('_', $matchCode, '_'))"/> </xsl:if> <xsl:text>,</xsl:text> </xsl:for-each>
关键逻辑说明
- 编码生成环节:使用格式串
000做格式化,会自动将数值补前导零到3位,不会出现小数分隔符、千分位符干扰匹配,例如0.03*100=3会自动转为003,完全匹配编码规则。 - Note匹配环节:通过判断节点内容是否包含
_三位编码_片段做匹配,不限制前缀内容,适配不同前缀的Note场景;末尾加[1]是为了避免多个匹配节点时出现内容重复。 - 文本提取环节:直接用
substring-after截取编码片段后的内容,无需拆分字符串,兼容XSLT 1.0/2.0/3.0全版本,不需要依赖额外扩展函数。
适配调整提示
- 如果你确定有效Note都是固定
11_前缀,可以把匹配条件改成../../cbc:Note[starts-with(., '11_') and substring(.,4,3) = $matchCode][1],匹配效率更高。 - 如果需要区分折扣/附加费,可以在循环内加对同级
cbc:ChargeIndicator节点值的判断,分别输出不同前缀文本。
内容的提问来源于stack exchange,提问作者Fatih Aydin
相关产品推荐
相关产品推荐

