Получение имени столбца таблицы HTML на основе столбца (td) в XPath - PullRequest
0 голосов
/ 10 июля 2019

Я перебираю столбец каждой строки (td) в таблице и пытаюсь получить имя соответствующего столбца, но у меня возникают проблемы.Я надеюсь сделать это программно, так как не всегда знаю количество столбцов в таблице, и мне приходится повторять это много раз по всему проекту.

Редактировать: это должно быть XSLT 1.0 в связи ск требованиям инструмента.

Пример XML / HTML:

<text>
    <table>
        <thead>
            <tr>
                <th>Allergy Name</th>
                <th>Reaction Description</th>
                <th>Start Date</th>
                <th>Severity</th>
                <th>Status</th>
                <th>Provider</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>MUCINEX D</td>
                <td>Hallucinations</td>
                <td>2015/11/19</td>
                <td>Critical</td>
                <td>Active</td>
                <td>Mickey Mouse, MD</td>
            </tr>
        </tbody>
    </table>
</text>

Фрагмент XSLT:

<xsl:for-each select="tr">
<!-Getting other data here-->
   <xsl:for-each select="td">
            <xsl:value-of select="~COLUMN NAME~"/> <!--Looking for the column name here-->
   </xsl:for-each>
</xsl:for-each>

В идеале я получу что-то вроде:

Allergy Name: MUCINEX D

и так далее через каждый столбец в таблице.

1 Ответ

1 голос
/ 10 июля 2019

Вы можете попробовать следующий код XSLT-1.0.Конечно, вам нужно настроить некоторые пути к фактическому макету файла.

<xsl:for-each select="table/tbody/tr">
    <!-- Getting other data here-->
    <xsl:for-each select="td">
        <xsl:variable name="pos" select="position()" />
        <xsl:value-of select="../../../thead/tr/th[$pos]"/> <!--Looking for the column name here-->
        <xsl:value-of select="concat(': ',.)"/>
        <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
</xsl:for-each>

Переменная сохраняет текущую позицию в наборе элементов td и использует ее как индекс для элементов th,Доступ к элементам th осуществляется по относительному пути;абсолютный путь может быть лучше, но это зависит от макета файла и от того, имеете ли вы дело с несколькими таблицами или только с одной.

Его вывод:

Allergy Name: MUCINEX D
Reaction Description: Hallucinations
Start Date: 2015/11/19
Severity: Critical
Status: Active
Provider: Mickey Mouse, MD

В качестве альтернативы вы можете использовать xsl:key с небольшим фокусом.Возможно, это быстрее, но неудобно с несколькими таблицами.

Однако вот так может выглядеть таблица стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="no" />
    <xsl:key name="hdr" match="tr/th" use="count(preceding-sibling::th) + 1" />

    <xsl:template match="/text">
        <xsl:for-each select="table/tbody/tr">
            <!-- Getting other data here-->
            <xsl:for-each select="td">
                <xsl:value-of select="key('hdr',position())" /> 
                <xsl:value-of select="concat(': ',.)"/>
                <xsl:text>&#xa;</xsl:text>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

Вывод один и тот же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...