2013-02-07 17 views
10

Mam tabeli wyników i wygląda na to, co następuje:jak wybrać kolumnę tabeli wg nazwy nagłówka kolumny z XPath

<table> 
    <thead> 
    <tr> 
     <th>Id</th> 
     <th>Type</th> 
     <th>Amount</th> 
     <th>Price</th> 
     <th>Name</th> 
     <th>Expiration</th> 
    </tr> 
    </thead> 
    <tbody> 
    <tr> 
     <td>123</td> 
     <td>Paper</td> 
     <td>10 pcs.</td> 
     <td>$10</td> 
     <td>Premium Copier paper</td> 
     <td>None</td> 
    </tr> 
    <tr> 
     <td>321</td> 
     <td>Paper</td> 
     <td>20 pcs.</td> 
     <td>$20</td> 
     <td>Extra Copier paper</td> 
     <td>None</td> 
    </tr> 
    </tbody> 

i chcę, aby zaznaczyć całą kolumnę przez jego nazwę z XPath np Chcę, aby zwróconym wynikiem była tablica o wartości {<td>$10</td>, <td>$20</td>}, jeśli została wybrana przez nazwę kolumny "Cena". Jestem nowy w Xpath i nie jestem pewien, jak to zrobić, ale jestem pewien, że to możliwe.

Odpowiedz

22

Ok, znalazłem odpowiedź, że w ould wystarczy i wygląda dość elegancko. Oto wymagany łańcuch XPath:

//table/tbody/tr/td[count(//table/thead/tr/th[.="$columnName"]/preceding-sibling::th)+1] 

Wpisz nazwę kolumny zamiast $ columnName. To działa dobrze dla mnie. Nie ma XSL ani nic, tylko czysty łańcuch xpath. Jak go zastosować - to kolejne pytanie.

0

Można użyć tego XPath:

/table/tbody/tr/td[count(preceding-sibling::td)+1 = count(ancestor::table/thead/tr/th[.='Price']/preceding-sibling::th)+1] 

Myślę testowania pozycję (position()) z td przeciwko stanowisku odpowiednim th będzie działać, ale nie wydaje się, gdy byłem testowania .

+0

Wygląda na to, że nie działa. Nie mam pojęcia dlaczego, ale już znalazłem rozwiązanie. –

+0

@EduardSukharev - Powinieneś dodać swoje rozwiązanie jako odpowiedź i zaakceptować je. –

+1

Tak, ale mam mało punktów, więc nie mogłem dodać własnego rozwiązania przez pierwsze 6 godzin. –

1

Jeśli znalazłeś rozwiązanie, proponujemy umieszczenie go jako odpowiedź tutaj, ale tylko dla zabawy, to w jaki sposób podchodzę tak:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

    <xsl:key name="kCol" match="td" use="count(. | preceding-sibling::td)"/> 
    <xsl:param name="column" select="'Price'" /> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/"> 
    <found> 
     <xsl:apply-templates select="table/thead/tr/th" /> 
    </found> 
    </xsl:template> 

    <xsl:template match="th"> 
    <xsl:if test=". = $column"> 
     <xsl:apply-templates select="key('kCol', position())" /> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Uruchomiony z „cena” jako parametr wartość:

<found> 
    <td>$10</td> 
    <td>$20</td> 
</found> 

Uruchomiony z "nazwa" jako wartość parametru:

<found> 
    <td>Premium Copier paper</td> 
    <td>Extra Copier paper</td> 
</found> 
Powiązane problemy