Проблема здесь :
/HTML//TABLE/TR[2]/TD[$pos]
В XPath необходимо знать, что $x
- это число, и только тогда someElement[$x]
рассматривается как ярлыкsomeElement[position() = $x]
В XSLT 1.0 / XPath 1.0 есть только элементарная слабая типизация , а тип переменной не может быть указан и не известен в общем.
Вот почему это выражение XPath :
/HTML//TABLE/TR[2]/TD[$pos]
интерпретируется как :
/HTML//TABLE/TR[2]/TD[boolean($pos)]
и выбирает все TD
элементы, являющиеся дочерними элементами элемента TR
, являющегося вторым TR
дочерним элементом любого элемента TABLE
, являющегося потомком верхнего элемента XML-документа.
Solution :
В XPath 1.0 используйте либо полное не сокращенное выражение :
/HTML//TABLE/TR[2]/TD[position() = $pos]
, либо используйте более короткое :
/HTML//TABLE/TR[2]/TD[number($pos)]
В XPath 2.0 (XSLT 2.0) явно укажите тип переменной :
<xsl:variable name="pos" as="xs:integer" select="position()"/>
, и тогда ее можно будет использовать и правильно называтьxs:integer
в:
/HTML//TABLE/TR[2]/TD[$pos]