2012-05-03 40 views
1

我試圖使用xpath從註釋或其後的文本中返回值「Vancouver」。任何人都可以將我指向正確的方向嗎?使用XPath定位註釋的一部分

位置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> 

回答

2

這將註釋之後將其從文本:

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

這指定類的<ul>「Class1的」裏面的第一個<li>,只有當它包含「位置:」,後取字符串「位置:」 。如果你想放鬆,這是第一個麗的要求,使用這樣的:

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

這不是口才很好,如果你的它可能導致問題的「位置:#####」是在結構改變,因爲這是一個靜態的解決方案,但它適用於以上:

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

而這返回字符串等效,而不是一個節點。 衝了這一點,所以我會提供一個更好的解決方案,但這只是一些考慮... (它只是剝離「位置:」並返回後面的任何東西..)

0

使用

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

substring-after(/*/description/ul 
         /li[1]/text()[starts-with(., 'Location: ')], 
        '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 
相關問題