XSLT中fn:substring()多序列参数报错的解决办法咨询
XSLT substring函数报错解决方法
报错说明
执行XSLT时触发错误:
A sequence of more than one item is not allowed as the first argument of fn:substring()
问题根源
原XSLT中substring(*:Path1/*:Path2,1,500)的第一个参数*:Path1/*:Path2匹配到的是多个Path2节点,而fn:substring()要求第一个参数必须是单一字符串,不能是节点序列——即使把该序列存入变量,变量存储的仍是整个节点集合,因此报错无法解决。
可行解决方法
方法1:遍历每个Path2节点分别处理
如果需要为每个Path2元素生成对应的EB/ID节点,可通过xsl:for-each遍历节点序列,对每个节点单独调用substring:
<xsl:for-each select="*:Path1/*:Path2"> <xsl:element name="EB"> <xsl:element name="ID"> <xsl:value-of select="substring(., 1, 500)"/> </xsl:element> </xsl:element> </xsl:for-each>
方法2:拼接所有Path2内容后统一截取
如果需要把所有Path2的文本内容合并成一个字符串再截取前500个字符,可使用string-join()先拼接序列:
<xsl:element name="EB"> <xsl:element name="ID"> <xsl:value-of select="substring(string-join(*:Path1/*:Path2, ' '), 1, 500)"/> </xsl:element> </xsl:element>
注:string-join的第二个参数是分隔符,可根据需求调整为空格、换行或其他字符。
相关输入与原代码
输入XML
<Path1> <Path2>SENDER 1</Path2> <Path2> SENDER xyc</Path2> <Path2> SENDER </Path2> <Path2> ORG ID:</Path2> <Path2> ORG:=</Path2> <Path2> ORG </Path2> <Path2> BNF </Path2> <Path2> BNF NAME:=A</Path2> <Path2> BNF ADDRESS</Path2> <Path2> BNF FI ID:=</Path2> <Path2> BNF FI:=</Path2> <Path2> REC FI:=</Path2> <Path2> REC ID:=</Path2> <Path2> OBI:=</Path2> </Path1>
原XSLT代码
<xsl:element name="EB"> <xsl:element name="ID"> <xsl:value-of select="substring(*:Path1/*:Path2,1,500)"/> </xsl:element> </xsl:element>
内容的提问来源于stack exchange,提问作者Ankit Singh
相关产品推荐
相关产品推荐

