WedX - журнал о программировании и компьютерных науках

XSLT не может найти атрибуты ‹tr› внутри таблицы

Проблема

В настоящее время я работаю над функцией преобразования, чтобы взять заданный файл HTML и преобразовать его в пользовательский XML с помощью XSLT 2.0. Мне удалось преобразовать все, кроме атрибута align для тегов внутри таблицы.

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

<table frame="none" style="margin-left:0">
   <tbody>
      <tr align="left">
         <th style="text-align:left; vertical-align:top; border-right:1 solid black; border-bottom:1 solid black">Yeah</th>
         <th style="text-align:left; vertical-align:top; border-right:1 solid black; border-bottom:1 solid black">4321</th>
      </tr>
      <tr align="left">
         <th style="text-align:left; vertical-align:top; border-right:1 solid black; border-bottom:1 solid black">Blah</th>
         <th style="text-align:left; vertical-align:top; border-right:1 solid black; border-bottom:1 solid black">1234<sup>3</sup></th>
      </tr>
   </tbody>
</table>

Сначала я нацелился на таблицу, используя:

<xsl:template match="table">

Затем я просматриваю таблицу и беру различные теги и атрибуты, необходимые для преобразования, используя варианты выбора и когда. Но когда я пытаюсь получить атрибут align, используя следующий случай, он всегда терпит неудачу:

<xsl:when test="tbody/tr[1]/@align">
    <xsl:attribute name="align"><xsl:value-of select="tbody/tr[1]/@align"/></xsl:attribute>
</xsl:when>

Устранение неполадок

После некоторой отладки я обнаружил, что если я использую следующий случай, он отлично находит тег:

<xsl:when test="tbody/tr[1]">
    <xsl:attribute name="align"><xsl:value-of select="'Found TR'"/></xsl:attribute>
</xsl:when>

Я также протестировал XPath в Google Chrome и обнаружил, что путь tbody/tr[1]/@align действителен и работает нормально.

Одна странная вещь, которую я обнаружил, заключается в том, что по какой-то причине на вкладке стиля в инструменте разработчика Google Chrome атрибут align указан как:

tr[Attributes Style] {
    text-align: -webkit-left;
} 

Узнав об этом, я попытался использовать следующий случай, но все равно не получилось:

<xsl:when test="tbody/tr[1]/@text-align">
        <xsl:attribute name="align"><xsl:value-of select="tbody/tr[1]/@text-align"/></xsl:attribute>
</xsl:when>

TLDR: я могу настроить таргетинг на тег tr внутри таблицы, но не могу получить атрибут align с помощью XSLT 2.0.

Я, очевидно, не эксперт в XSLT, поэтому любые отзывы будут оценены.

19.07.2018

  • Можете ли вы уточнить, что вы имеете в виду, когда говорите ... Это всегда терпит неудачу. Вы получаете ошибку, например. Вероятно, было бы полезно, если бы вы показали полный XSLT, демонстрирующий вашу реальную проблему, а не небольшой фрагмент, поскольку, возможно, что-то еще вступает в игру... Обратите внимание, что в приведенном вами примере вы могли бы просто отказаться от xsl:choose / xsl:when и вместо этого сделайте <xsl:copy-of select="tbody/tr[1]/@align" />. Спасибо 19.07.2018
  • Нет, я не получаю никаких сообщений об ошибках, и остальная часть преобразования происходит правильно. Просто атрибут tr align не отображается в окончательном xml. Мне придется попробовать копию пути, потому что я не знал об этом. Спасибо 19.07.2018
  • Итак, я попробовал копию, но он все еще не может найти атрибут @align. 19.07.2018

Ответы:


1

Во втором примере этот text-align не является атрибутом. Именно style является атрибутом, а text-align является лишь частью значения атрибута. Похоже, что <tr align="left"> преобразуется в <tr style="text-align: left" > до того, как ваш XSLT завладеет им.

Извлечение «значения» text-align из атрибута стиля сложно, но возможно. Поскольку вы используете XSLT 2.0, вы можете сделать что-то вроде этого...

  <xsl:variable name="tokens" select="tokenize(tbody/tr[1]/@style, ';')" />
  <xsl:choose>
    <xsl:when test="contains(tbody/tr[1]/@style, 'text-align')">
      <xsl:attribute name="align" select="substring-after($tokens[substring-before(., ':') = 'text-align'], ':')" />
    </xsl:when> 
  </xsl:choose>

Таким образом, он разбивает значение атрибута на разделитель ; и находит часть, начинающуюся с «text-align».

19.07.2018
  • Итак, я только что попробовал это, и он все еще не находит выравнивание. При тестировании моих XPath в консоли Chrome я обнаружил, что $x(содержит(//tbody/tr[1]/@align, 'left')) возвращает true, а $x(содержит(//tbody/tr[1]/ @style, 'text-align')) возвращает false. когда я использую $x(contains(//tbody/tr[1]/@align, 'left')) в своем выражении when, он все равно не проходит тест 23.07.2018
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]