2011-03-04 38 views

回答

1

嘗試

substring-after(//TD[starts-with(text(),' Ref. :')]/text(),' Ref. : ') 

國債收益率

XYZ 

更新

繼亞歷杭德羅的有關列出幾個節點的話,在這裏上市是在Java中幾個陣(標準JDK Java解析器)的Java示例。

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpression; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 

public class TestXPath { 

    private static final String FILE = "a.xhtml" ; 
    private static final String XPATH = "//td[starts-with(.,'Ref. :')]"; 
    public static void main(String[] args) { 

     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     docFactory.setNamespaceAware(true); 
     DocumentBuilder builder; 
     try { 
      builder = docFactory.newDocumentBuilder(); 
      Document doc = builder.parse(FILE); 
      XPathExpression expr = XPathFactory.newInstance().newXPath().compile(XPATH); 
      Object hits = expr.evaluate(doc, XPathConstants.NODESET) ; 
      if (hits instanceof NodeList) { 
       NodeList list = (NodeList) hits ; 
       for (int i = 0; i < list.getLength(); i++) { 
        System.out.println(list.item(i).getTextContent().substring(" Ref. :".length())); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

適用於以下測試XHTML文件

<html> 
<head> 
</head> 
<body> 
    <table> 
     <thead> 
      <tr> 
       <td>col1</td> 
       <td>col2</td> 
       <td>col3</td> 
       <td>col4</td> 
      </tr> 
     </thead> 
     <tbody> 
      <tr> 
       <td colSpan="4">Ref. : Line 1</td> 
      </tr> 
      <tr> 
       <td colSpan="4">Ref. : Line 2</td> 
      </tr> 
      <tr> 
       <td colSpan="4">Ref. : Line 3</td> 
      </tr> 
      <tr> 
       <td colSpan="4">Ref. : Line 4</td> 
      </tr> 
     </tbody> 
    </table> 
</body> 
</html> 

它產生

Line 1 
Line 2 
Line 3 
Line 4 
+1

不要將混合內容數據模型中的文本節點用作XHTML,元素的字符串值是更好的選擇。 – 2011-03-04 14:25:03

+1

@Alejandro,像這樣? 'substring-after(string(// TD [starting-with(。,'Ref。:))),'Ref。:')'或甚至'substring-after(string(// TD [starts-with字符串(。),'Ref。:')]),'Ref。:')'? – 2011-03-04 14:32:23

+0

是的,像'substring-after(// TD [starts-with(。,'Ref。:))','Ref。:')''。但請注意,隱式轉換隻會選擇第一個選擇的「TD」。 – 2011-03-04 14:45:34

1

您可以選擇整個文本,然後在XSLT串吧。

<xsl:value-of 
    select="normalize-space(substring-after(.//html:td/text(), 'Ref. :'))"/> 
+0

我希望在java中完成.. – 2011-03-04 14:12:12

+0

@Praneel然後選擇整個文本值,然後在Java中創建子字符串。我不認爲你不能在XPath表達式中使用節點的值。 – 2011-03-04 14:53:58

0

<TD colSpan=4> Ref. : XYZ</TD>

我試圖檢索值XYZ 使用XPATH

//td[text()=" Ref. :"]

,但我無法得到那個......能 任何人發現錯誤..

別的之前,你的XPath表達式的一個重大問題:被應用在提供XML文檔

//td[text()=" Ref. :"] 

<TD colSpan=4> Ref. : XYZ</TD> 

是,XPath是大小寫敏感的

即使其他所有東西都是正確的(不是這樣),使用小寫名稱的表達式在應用於包含大寫名稱的XML文檔時決不會選擇任何節點。

所以,如果我們解決此問題的XPath表達式變成:

//TD[text()=" Ref. :"] 

雖然這種表達會選擇頂部(只)提供的XML文檔的元素,也不會產生想要的值。

我會使用XPath是

substring-after(/TD, 'Ref. : ') 

或(知道一個良好的XML文檔僅具有一個頂部元件):

substring-after(/*, 'Ref. : ')