XSLT1.0中copy-of筛选IDOC节点匹配不到数据问题排查
故障原因
转换逻辑匹配不到目标节点的核心问题是XSLT参数定义语法错误,节点筛选的XPath逻辑本身没有问题:
- 你定义参数时写的
<xsl:param name="Doc" select="SL000000598" />不符合XSLT 1.0语法规则:select属性内的内容会被解析为XPath表达式,不加引号的SL000000598会被引擎识别为「查找当前上下文下名为SL000000598的XML子节点」,而非你预期的字符串值。由于源XML中不存在这个名称的节点,参数实际取值为空,自然无法匹配到HEADER_TXT符合条件的IDOC节点。
修正后的转换代码
只需要给参数的字符串默认值包裹单引号,明确声明为字符串常量即可,完整代码如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 字符串类型的参数默认值必须加引号,否则会被识别为XPath节点选择表达式 --> <xsl:param name="Doc" select="'SL000000598'" /> <xsl:template match="/ACC_DOCUMENT04"> <ACC_DOCUMENT04> <xsl:copy-of select="IDOC[E1BPACHE09/HEADER_TXT=$Doc]"/> </ACC_DOCUMENT04> </xsl:template> </xsl:stylesheet>
注意事项
- 如果是通过外部程序、ETL工具动态传入
Doc参数,外部传入的字符串会自动覆盖XSLT里写的默认值,不需要额外加引号处理;只有硬编码在XSLT文件内的字符串默认值需要按上述规则加引号。 - 原筛选逻辑里的
./IDOC前缀的./是冗余写法,直接写IDOC即可,不影响匹配结果。
内容的提问来源于stack exchange,提问作者Ryan B
相关产品推荐
相关产品推荐

