Spring 命名空间的 Spel XPATH 表达式但没有前缀

Spring Spel XPATH Expression for Namespace but no prefix

问题:尝试使用 SpEL xpath 构建正确的 XPATH 以关联 "Name" 标签值,其中根标签具有名称空间但没有前缀。

错误:意外的令牌。预期 'rparen())' 但 'identifier' 它在抱怨 & #39;我试图在 xpath 评估中使用单引号。

XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns="http://www.foo.com">
<id></id>
<Name>test</Name>
</root>

Spring 配置

<aggregator 
    id="agg1" 
    input-channel="requestChannel"
    output-channel="outputChannel" 
    discard-channel="garbageCanChannel"
    ref="blah" 
    method="combine"
    expire-groups-upon-completion="true"
    correlation-strategy-expression="#xpath(payload, '//*[local-name()]=&#39;Name&#39;/text()')"
    release-strategy="blah"
    release-strategy-method="timeToRelease"
    send-partial-result-on-expiry="false"
    send-timeout="60000"
    group-timeout="60000"
    />

更新:

所以在下载 spring 源代码并跟踪问题之后。似乎在下面的方法中执行标记化期间,Spring 将 "Name" 视为标识符而不是字符串文字的一部分。至少这是工作实例和失败实例之间的区别 instance.Most 可能我没有正确转义它。

Class:InternalSpelExpressionParser.java Method:doParseExpression

this.expressionString = "#xpath(payload, '//*[local-name()=Name]')"//This works
[[HASH(#)](0,1), [IDENTIFIER:xpath](1,6), [LPAREN(()](6,7), [IDENTIFIER:payload](7,14), [COMMA(,)](14,15), [LITERAL_STRING:'//*[local-name()=Name]'](16,45), [RPAREN())](45,46)]


this.expressionString = "#xpath(payload, '//*[local-name()='Name']')"//Thisfails
[[HASH(#)](0,1), [IDENTIFIER:xpath](1,6), [LPAREN(()](6,7), [IDENTIFIER:payload](7,14), [COMMA(,)](14,15), [LITERAL_STRING:'//*[local-name()='](16,35), [IDENTIFIER:Name](35,44), [LITERAL_STRING:']'](44,47), [RPAREN())](47,48)]

解法: ...

correlation-strategy-expression="#xpath(payload, '//*[local-name()=''Name'']/text()')"

正确的字符串文字: - 你可以看到它现在是正确的,因为标记化过程将所有内容都放在字符串文字标记中。

[[HASH(#)](0,1), [IDENTIFIER:xpath](1,6), [LPAREN(()](6,7), [IDENTIFIER:payload](7,14), [COMMA(,)](14,15), [LITERAL_STRING:'//*[local-name()=''Name'']/text()'](16,56), [RPAREN())](56,57)]

其他调试说明:

这里拉出springgit时:

https://github.com/spring-projects/spring-framework

  1. 接受所有项目。
  2. 根是"import=into-eclipse.bat"或"import-into-idea",我没看到。您可以执行它以在本地完全构建和签出您需要的所有内容并导入项目以便您可以跟踪问题。

您发布的表达式将产生无效的 XPath。它应该在 /text() 之前有右方括号,而不是 :

'//*[local-name()=&#39;Name&#39;]/text()'

可能使用双单引号转义,如建议here :

'//*[local-name()=''Name'']/text()'