Попытка преобразовать таблицу HTML в XML с помощью атрибутов - выбрать заголовки и данные - PullRequest
1 голос
/ 17 декабря 2011

У меня есть простой HTML-файл ввода;который содержит таблицу.Заголовки столбцов таблицы HTML определены в строке 2;и данные следуют для строки 2 +.

Так что я собираю данные следующим образом:

<xsl:template match="HTML">
    <xsl:apply-templates select="//TABLE/TR[position() > 2]"/>
</xsl:template>

<xsl:template match="TR">
    <xsl:apply-templates select="TD"/>
</xsl:template>



   <xsl:template match="TD">
    <xsl:variable name="pos"><xsl:value-of select="position()"/></xsl:variable>
    <xsl:value-of select="normalize-space(.)"/>
        <xsl:text>&#10;</xsl:text>
        <xsl:value-of select="/HTML//TABLE/TR[2]/TD[$pos]"/>
    </xsl:template>

(Этот последний шаблон является отладочной версией; окончательный вывод япосле это использовать информацию заголовка для генерации динамических имен атрибутов)

Я пытаюсь получить переменную $ pos для индексации TR [2] в документе: она всегда равна '1' ;Первоначально я просто пытался использовать 'position ()' и индекс, но это не работает для меня.

Я знаю (если я делаю 'xsl: value-of'), что $ pos корректно меняется, но в предикате он, кажется, превращается в 1 ....

Что мне нужно сделать здесь ...

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

Проблема здесь :

/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]
0 голосов
/ 17 декабря 2011

Понял; по какой-то причине я должен разыграть (принудительно?) $ pos с помощью числовой функции:

<xsl:value-of select="/HTML//TABLE/TR[2]/TD[number($pos)]"/>

Я все еще не могу использовать position () непосредственно в этом предикате - возможно потому, что не ясно, о какой позиции () я говорю?

...