如何在XPath 1.0中编写此XPath 2.0查询

时间:2014-10-01 12:08:33

标签: xpath xpath-2.0

我有一个XPath 2.0查询(看起来没问题,并返回我希望它返回的节点)但是,但是我需要在XPath 1.0中编写它。是否可能,如果是,我该怎么做?

信息:

我想要做的是连接tokenValue下所有IDENTIFIERDOT个节点的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>

提前谢谢!

2 个答案:

答案 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']