Это выражение 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