таблица разбора в XPATH - PullRequest
1 голос
/ 04 марта 2011
<TR>
 <TD>Field 1</TD>
 <TD colSpan=2>Field 2</TD>
 <TD>Field 3</TD>
</TR>
<TR>
 <TD>Value for Field1</TD>
 <TD colSpan=2>Value for Field2</TD>
 <TD>Value for Field3</TD>
<TR></TR>
</TR>

Как я могу сопоставить Поле с его значением?Я использую XPATH для синтаксического анализа моего html-файла.

И основная проблема заключается в количестве полей, изменяющихся в каждом входе ... Но, как вы знаете, макет будет таким же ...

Ответы [ 3 ]

2 голосов
/ 04 марта 2011

Это выберет вам имена полей:

//table/tr[position() mod 2 = 0]/td/text()

Это выберет вам значения полей:

//table/tr[position() mod 2 = 1]/td/text()
1 голос
/ 04 марта 2011

Это выражение XPath :

/*/*[2]/TD
         [position()
         =
         count(/*/*[1]
                    /TD[.=$pName]/preceding-sibling::TD
              ) +1
         ]

выбирает TD со "значением", соответствующим "имени", указанному в переменной pName

Таким образом, если вы замените $pName в вышеприведенном выражении на 'Field 2', будет выбрано следующее:

<TD colSpan="2">Value for Field2</TD>

Примечание : Это выражение XPath выбирает правильный узел даже в случае, когда две строки имеют различное число TD с.

Чтобы выбрать только текстовый дочерний узел TD, добавьте /text() к выражению.

Чтобы получить только строковое значение, используйте :

  string(/*/*[2]/TD
             [position()
             =
             count(/*/*[1]
                        /TD[.=$pName]/preceding-sibling::TD
                  ) +1
             ]
        )

Вот короткое XSLT-преобразование, доказывающее, что искомое значение получено :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:param name="pName" select="'Field 2'"/>

 <xsl:template match="/">
  <xsl:value-of select=
   "/*/*[2]/TD
             [position()
             =
             count(/*/*[1]
                        /TD[.=$pName]/preceding-sibling::TD
                  ) +1
             ]
   "/>
 </xsl:template>
</xsl:stylesheet>

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

<TABLE>
    <TR>
        <TD>Field 1</TD>
        <TD colSpan="2">Field 2</TD>
        <TD>Field 3</TD>
    </TR>
    <TR>
        <TD>Value for Field1</TD>
        <TD colSpan="2">Value for Field2</TD>
        <TD>Value for Field3</TD>
        <TR></TR></TR>
</TABLE>

желаемый результат получен:

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

С этим входом:

<TABLE>
    <TR>
        <TD>Field 1</TD>
        <TD colSpan="2">Field 2</TD>
        <TD>Field 3</TD>
    </TR>
    <TR>
        <TD>Value for Field1</TD>
        <TD colSpan="2">Value for Field2</TD>
        <TD>Value for Field3</TD>
    </TR>
</TABLE>

Это выражение XPath:

/TABLE/TR/TD[.='Field 3']/following::TD[count(../TD)]

Выбирает этот элемент:

<TD>Value for Field3</TD>

Примечание : Это предполагает "обычную" таблицу.

...