XSLT для каждого цикла преобразования - PullRequest
0 голосов
/ 25 октября 2018

Мне только что дали задание преобразовать некоторые данные, но, к сожалению, я раньше не касался XSLT, и поэтому я довольно новичок в этих концепциях.Мне удалось преобразовать статический контент, но файлы, которые меня просили, содержат структуры в виде таблиц с различным количеством строк и столбцов.

То, чего я в конечном итоге пытаюсь достичь, - это то же самое, но переведено на HTML.

Вот пример псевдо-XML, который мне нужно перевести.

<document>
<item> 
    <richtext>
    <rubbishToIgnore> Don't include this </rubbishToIgnore>
        <mytable>
            <myrow>
            <rubbishToIgnore> Don't include this </rubbishToIgnore>
            <rubbishToIgnore> Don't include this </rubbishToIgnore>
                <mycol colspan="2" >Data 1 </mycol>
            </myrow>
            <myrow>
                <mycol>Data 2 </mycol>
            </myrow>
            <myrow>
                <mycol>Data 3 </mycol>
            </myrow>
        </mytable>
        <mytable>
            <myrow>
                <mycol colspan="2" >Data 1 </mycol>
            </myrow>
            <myrow>
                <mycol>Data 2 </mycol>
            </myrow>
            <myrow>
                <mycol>Data 3 </mycol>
            </myrow>
            <myrow>
                <mycol>Data 4 </mycol>
            </myrow>
        </mytable>
</item>
<item> 
    <richtext>
    <rubbishToIgnore> Don't include this </rubbishToIgnore>
        <mytable>
            <myrow>
            <rubbishToIgnore> Don't include this </rubbishToIgnore>
            <rubbishToIgnore> Don't include this </rubbishToIgnore>
                <mycol colspan="2" >Data 1 </mycol>
            </myrow>
            <myrow>
                <rubbishToIgnore> Don't include this </rubbishToIgnore>
                <mycol>Data 2 </mycol>
            </myrow>
            <myrow>
                <mycol>Data 3 </mycol>
            </myrow>
        </mytable>
        <mytable>
            <myrow>
                <mycol colspan="2" >Data 1 </mycol>
            </myrow>
            <myrow>
                <mycol>Data 2 </mycol>
            </myrow>
        </mytable>
</item>

Я просто ищу несколько указателей / помощи по правильному способу циклического прохождения XML с использованием XSLT и создания простой таблицы HTML.

Это псевдокод XSLT, о котором я думал.

<xsl:for-each select="document/item>
<xsl:for-each select="document/item/richtext>
<xsl:for-each select="document/item/richtext/mytable">
    <table border = "1">
        <xsl:for-each select="document/item/richtext/myrow">
            <tr>
                <xsl:for-each select="document/item/richtext/mycol">
                    <td>
                        <xsl:value-of select="document/item/richtext/mycol"/>
                    <td>
                </xsl:for-each>
            <tr>
        </xsl:for-each>
    </table>
</xsl:for-each>

А пока я сам попробую разобраться в этом, пройдя учебники по W3schools.

Спасибо, ребята / девочки!:)

1 Ответ

0 голосов
/ 25 октября 2018

У вас проблема с вложенными xsl:for-each утверждениями.Второй не будет ничего выбирать ...

<xsl:for-each select="document/item">
  <xsl:for-each select="document/item/richtext">

Это потому, что первый xsl:for-each выбирает элемент item, и поэтому ваш вложенный оператор xsl:for-each будет относительно этогоitem элемент.Другими словами, он ищет дочерний элемент с именем document, которого явно не существует.

На самом деле эти первые два утверждения вам вообще не нужны.Вы можете просто использовать третий для непосредственного получения элементов.

<xsl:for-each select="document/item/richtext/mytable">

Та же проблема с выбором дочерних узлов относится и к остальным вашим операторам xsl:for-each.Так, например, чтобы выбрать строки, вы должны сделать это ...

<xsl:for-each select="myrow">

Попробуйте это XSLT

<xsl:template match="/">
  <xsl:for-each select="document/item/richtext/mytable">
    <table border = "1">
      <xsl:for-each select="myrow">
        <tr>
          <xsl:for-each select="mycol">
            <td>
              <xsl:value-of select="."/>
            </td>
          </xsl:for-each>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:for-each>
</xsl:template>

Однако, если вы намереваетесь сделать больше XSLT, вы можете захотетьрассмотреть возможность использования подхода, который использует шаблоны.Не то, чтобы была какая-либо проблема с операторами for-each, но в этом случае это помогло бы уменьшить вложенность и размер блоков кода.

Попробуйте также этот XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" html-version="5"/>

<xsl:template match="/">
  <xsl:apply-templates select="document/item/richtext/mytable" />
</xsl:template>

<xsl:template match="mytable">
  <table border = "1">
    <xsl:apply-templates select="myrow" />
  </table>
</xsl:template>

<xsl:template match="myrow">
  <tr>
    <xsl:apply-templates select="mycol" />
  </tr>
</xsl:template>

<xsl:template match="mycol">
  <td>
    <xsl:value-of select="."/>
  </td>
</xsl:template>
</xsl:stylesheet>

Иесли вы хотите включить атрибут colspan, измените соответствующий шаблон mycol на этот ...

<xsl:template match="mycol">
  <td>
    <xsl:copy-of select="@colspan" />
    <xsl:value-of select="."/>
  </td>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...