1

我正在尝试使用 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>
4

3 回答 3

2

这将从评论后的文本中提取它:

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

这指定了类“class1”中的第一个,仅当它包含“Location:”时,并采用“Location:”之后的字符串<li><ul>如果你想放宽它是第一个 li 的要求,使用这个:

substring-after(//ul[@class='class1']/li[contains(.,'Location:')],'Location: ')
于 2012-05-03T19:29:24.293 回答
0

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

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

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

于 2012-05-03T19:28:41.743 回答
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 
于 2012-05-04T13:25:06.270 回答