使用XPath定位评论的一部分

时间:2012-05-03 19:02:35

标签: xpath

我正在尝试使用xpath从注释或后面的文本返回值“Vancouver”。有人能指出我正确的方向吗?

位置li始终是第一个项目,但并不总是存在,并且每个项目后列表项目的数量会有所不同。

<item>
<title>
<description>
<!-- Comment #1 -->
<ul class="class1">
<li> <!-- ABC Location=Vancouver -->Location: Vancouver</li>
<li> <!-- More comments -->Text</li>
<li> text</li>
</ul>
</description>
</item>

3 个答案:

答案 0 :(得分:2)

这将在评论后从文本中删除:

substring-after(//ul[@class='class1']/li[position()=1 and contains(.,'Location:')],'Location: ')

这指定了类'class1'的<li>内的第一个<ul>,仅当它包含'Location:'时,并在'Location:'之后取字符串。如果你想放宽它作为第一个li的要求,请使用:

substring-after(//ul[@class='class1']/li[contains(.,'Location:')],'Location: ')

答案 1 :(得分:0)

这不是雄辩的,如果您的“位置:#####”要在结构上进行更改,它可能会导致问题,因为这是一个静态解决方案,但它适用于上述情况:

substring(//item//li[1],12,string-length(//item//li[1])-10)

这将返回等效的字符串,而不是节点。 冲了一下这个,所以我会随着时间的推移给出一个更好的解决方案,但这只是需要考虑的事情...... (它只是剥离“位置:”并返回它之后的任何内容..)

答案 2 :(得分:0)

使用

  substring-after(/*/description/ul
                       /li[1]/text()[starts-with(., 'Location: ')],
                  'Location: '
                  )

要从评论中提取位置

  substring-after(/*/description/ul
                       /li[1]/comment()[starts-with(., ' ABC Location=')],
                  ' ABC Location='
                  )

基于XSLT的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "substring-after(/*/description/ul
                           /li[1]/text()[starts-with(., 'Location: ')],
                      'Location: '
                      )
     "/>
==========

     <xsl:copy-of select=
     "substring-after(/*/description/ul
                           /li[1]/comment()[starts-with(., ' ABC Location=')],
                      ' ABC Location='
                      )
     "/>

 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<item>
    <title/>
    <description>
        <!-- Comment #1 -->
        <ul class="class1">
            <li>
                <!-- ABC Location=Vancouver -->Location: Vancouver
            </li>
            <li>
                <!-- More comments -->Text
            </li>
            <li> text</li>
        </ul>
    </description>
</item>

评估两个XPath表达式,并将评估结果复制到输出中:

Vancouver

==========

Vancouver