2011-03-04 27 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. : ')