Невозможно получить значение, используя // td [text () = "Ref.:"] В XPATH - PullRequest
1 голос
/ 04 марта 2011
  <TD colSpan=4> Ref. : XYZ</TD>

Я пытаюсь получить значение XYZ, используя XPATH

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

Но я не могу получить это ... может кто-нибудь найти ошибку ..

Ответы [ 3 ]

1 голос
/ 04 марта 2011

Вы можете выделить весь текст и затем вставить его в XSLT.

<xsl:value-of 
     select="normalize-space(substring-after(.//html:td/text(), 'Ref. :'))"/>
1 голос
/ 04 марта 2011

Попробуйте

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

Это дает

XYZ

Обновление

После замечания Алехандро о перечислении нескольких узлов, вот пример Javaперечисления нескольких TD в Java (стандартный синтаксический анализатор JDK 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
0 голосов
/ 04 марта 2011

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

Я пытаюсь получить значение XYZ, используя XPATH

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

Но я не могу этого получить ...может кто-нибудь найти ошибку ..

Прежде всего, одна серьезная проблема вашего выражения XPath :

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

применяется к предоставленному документу XML:

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

означает, что XPath чувствителен к регистру .

Даже если все остальное верно (что не так), выражение использует имена в нижнем регистреникогда не выберет ни один узел при применении к документу XML, содержащему имена в верхнем регистре.

Итак, если мы исправим эту проблему, выражение XPath станет:

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

Хотя это выражение выберетверхний (и единственный) элемент предоставленного XML-документа, он не выдает искомого значения.

Я бы использовал XPath :

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

или(зная, что правильно сформированный документ XML имеет только один верхний элемент):

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