我有一个XPath 2.0查询(看起来没问题,并返回我希望它返回的节点)但是,但是我需要在XPath 1.0中编写它。是否可能,如果是,我该怎么做?
信息:
我想要做的是连接tokenValue
下所有IDENTIFIER
和DOT
个节点的qualifiedIdentifier
,如果此连接结果选择qualifiedIdentifier
个节点在以“another.pkg”开头的字符串中。
XPath 2.0查询:
//importDeclaration/qualifiedIdentifier[starts-with(string-join(descendant::*/*/@tokenValue,''),'another.pkg')]
xml:
<compilationUnit tokenValue="package" tokenLine="1" tokenColumn="0">
<packageDeclaration tokenValue="package" tokenLine="1" tokenColumn="0">
<PACKAGE tokenValue="package" tokenLine="1" tokenColumn="0">
<TOKEN tokenValue="package" tokenLine="1" tokenColumn="0"/>
</PACKAGE>
<qualifiedIdentifier tokenValue="my" tokenLine="1" tokenColumn="8">
<IDENTIFIER tokenValue="my" tokenLine="1" tokenColumn="8">
<TOKEN tokenValue="my" tokenLine="1" tokenColumn="8"/>
</IDENTIFIER>
<DOT tokenValue="." tokenLine="1" tokenColumn="10">
<TOKEN tokenValue="." tokenLine="1" tokenColumn="10"/>
</DOT>
<IDENTIFIER tokenValue="pkg" tokenLine="1" tokenColumn="11">
<TOKEN tokenValue="pkg" tokenLine="1" tokenColumn="11"/>
</IDENTIFIER>
</qualifiedIdentifier>
<SEMI tokenValue=";" tokenLine="1" tokenColumn="14">
<TOKEN tokenValue=";" tokenLine="1" tokenColumn="14"/>
</SEMI>
</packageDeclaration>
<importDeclaration tokenValue="import" tokenLine="3" tokenColumn="0">
<IMPORT tokenValue="import" tokenLine="3" tokenColumn="0">
<TOKEN tokenValue="import" tokenLine="3" tokenColumn="0"/>
</IMPORT>
<qualifiedIdentifier tokenValue="another" tokenLine="3" tokenColumn="7">
<IDENTIFIER tokenValue="another" tokenLine="3" tokenColumn="7">
<TOKEN tokenValue="another" tokenLine="3" tokenColumn="7"/>
</IDENTIFIER>
<DOT tokenValue="." tokenLine="3" tokenColumn="14">
<TOKEN tokenValue="." tokenLine="3" tokenColumn="14"/>
</DOT>
<IDENTIFIER tokenValue="pkg" tokenLine="3" tokenColumn="15">
<TOKEN tokenValue="pkg" tokenLine="3" tokenColumn="15"/>
</IDENTIFIER>
<DOT tokenValue="." tokenLine="3" tokenColumn="18">
<TOKEN tokenValue="." tokenLine="3" tokenColumn="18"/>
</DOT>
<IDENTIFIER tokenValue="AnotherClass" tokenLine="3" tokenColumn="19">
<TOKEN tokenValue="AnotherClass" tokenLine="3" tokenColumn="19"/>
</IDENTIFIER>
</qualifiedIdentifier>
<SEMI tokenValue=";" tokenLine="3" tokenColumn="31">
<TOKEN tokenValue=";" tokenLine="3" tokenColumn="31"/>
</SEMI>
</importDeclaration>
<typeDeclaration tokenValue="public" tokenLine="5" tokenColumn="0">
<modifier tokenValue="public" tokenLine="5" tokenColumn="0">
<PUBLIC tokenValue="public" tokenLine="5" tokenColumn="0">
<TOKEN tokenValue="public" tokenLine="5" tokenColumn="0"/>
</PUBLIC>
</modifier>
<classDeclaration tokenValue="class" tokenLine="5" tokenColumn="7">
<CLASS tokenValue="class" tokenLine="5" tokenColumn="7">
<TOKEN tokenValue="class" tokenLine="5" tokenColumn="7"/>
</CLASS>
<IDENTIFIER tokenValue="AClass" tokenLine="5" tokenColumn="13">
<TOKEN tokenValue="AClass" tokenLine="5" tokenColumn="13"/>
</IDENTIFIER>
<classBody tokenValue="{" tokenLine="5" tokenColumn="20">
<LWING tokenValue="{" tokenLine="5" tokenColumn="20">
<TOKEN tokenValue="{" tokenLine="5" tokenColumn="20"/>
</LWING>
<RWING tokenValue="}" tokenLine="6" tokenColumn="0">
<TOKEN tokenValue="}" tokenLine="6" tokenColumn="0"/>
</RWING>
</classBody>
</classDeclaration>
</typeDeclaration>
<EOF tokenValue="" tokenLine="6" tokenColumn="1"/>
</compilationUnit>
提前谢谢!
答案 0 :(得分:2)
我认为在XPath 1.0中有一种方法可以像2.0版一样通用,你必须更加具体,例如检查前三个令牌是否分别为another
,.
和pkg
//importDeclaration/qualifiedIdentifier[*[1]/*/@tokenValue = 'another']
[*[2]/*/@tokenValue = '.']
[*[3]/*/@tokenValue = 'pkg']
这比你的2.0版本稍微严格一点,要完全相同,你必须检查第三个令牌以 pkg
开头,而不是等于 pkg
(例如,允许"another.pkgfoo"
,但实际上这可能并不合适。)
答案 1 :(得分:1)
如果标记化始终相同,则可以连接前三个标记:
//importDeclaration/qualifiedIdentifier[concat((.//*/*/@tokenValue)[1],
(.//*/*/@tokenValue)[2],
(.//*/*/@tokenValue)[3])='another.pkg']