java:查找特定节点的绝对xpath

时间:2014-01-29 10:47:57

标签: java xml xpath xhtml

是否可以找到XML或XHTML文件的任何特定节点的xpath?

对于(例如)

    <html>
     <body>
      <div id="a">
       <div> 
       </div>
       <div class"b">
        <div>
//I want xpath of below line only
          <a id="c">Here </a>
        </div>
       </div>
      </div>
     </body>
    </html>

如上所示,如果我只想要<a id="c">Here </a>行的xpath。 答案应该是: - /html/body/div/div[2]/a[@id="c"]有可能吗?如果是的话,你能提供代码吗?提前致谢。 :)

1 个答案:

答案 0 :(得分:1)

在XPath 3.0中有一个函数path()可以大致按你的意愿行事,虽然不是很精确(处理器应该怎么知道你想要包含谓词[@id="c"]?)

在XSLT中很容易做到这样的事情:

<xsl:template match="*[@id]" mode="path">
  <xsl:next-match/>
  <xsl:value-of select="concat('[@id=&quot;', @id, '&quot;]')"/>
</xsl:template>

<xsl:template match="*[last()!=1]" mode="path">
  <xsl:next-match/>
  <xsl:text>[</xsl:text>
  <xsl:number/>
  <xsl:text>]</xsl:text>
</xsl:template>

<xsl:template match="*" mode="path">
  <xsl:apply-templates select="parent::*" mode="path"/>
  <xsl:text>/</xsl:text>
  <xsl:value-of select="name()"/>
</xsl:template>

如果您真的必须在Java中执行此操作,则可以从Java调用上述XSLT或重写它。但是,对于一个完全通用的解决方案,您需要担心命名空间,而您对命名空间的处理取决于您首先想要路径的原因:是针对人类读者还是针对软件?