@tj57

Как делать xslt-преобразование для длинных xml-файлов?

Я недавно познакомился с xslt-преобразованиями. У меня стоит задача сделать преобразование для xml файла, чтобы данные были выведены в виде таблиц. Пример небольшого фрагмента:
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>

<root>
  <APPLICATION ID="88deeba4-69b1-454a-992a-fae3cebfbca1" TYPENAME="MTZMetaModel" NAME="Спец:Метамодель" IsLocked="LockPermanent" WorkOffline="False" STATUS="00000000-0000-0000-0000-000000000000" SecureStyleID="00000000-0000-0000-0000-000000000000">
    <MTZAPP_COL IsLocked="0">
      <MTZAPP ID="ff0e4214-a70d-484c-8b80-0ff708b1837c" Deleted="False" IsLocked="0" RetriveTime="636886968601287765" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" Name="Администрирование" DBName="" TheComment="">
        <ParentPackage_COL IsLocked="0" />
      </MTZAPP>
      <MTZAPP ID="a719b764-60a2-4090-bf9b-0ca9501b8da8" Deleted="False" IsLocked="0" RetriveTime="636886968601287765" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" Name="Ядро" DBName="" TheComment="">
        <ParentPackage_COL IsLocked="0" />
      </MTZAPP>
      <MTZAPP ID="0290e99f-62ec-4012-9fed-3589d8fd1590" Deleted="False" IsLocked="0" RetriveTime="636886968601287765" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" Name="BP3" DBName="" TheComment="Среда быстрого прототипирования V3">
        <ParentPackage_COL IsLocked="0" />
      </MTZAPP>
      <MTZAPP ID="46ed2fa7-4f35-4527-91a6-a61cfe1c3905" Deleted="False" IsLocked="0" RetriveTime="636886968601287765" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" Name="iUROK" DBName="" TheComment="">
        <ParentPackage_COL IsLocked="0" />
      </MTZAPP>
      <MTZAPP ID="946f9ece-7281-488f-99d0-3a4f64da5c1d" Deleted="False" IsLocked="0" RetriveTime="636886968601287765" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" Name="СТД" DBName="" TheComment="">
        <ParentPackage_COL IsLocked="0" />
      </MTZAPP>
      <MTZAPP ID="2eb473eb-a886-47ad-abab-4e4b3642dcf2" Deleted="False" IsLocked="0" RetriveTime="636886968601287765" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" Name="Ядро2" DBName="" TheComment="">
        <ParentPackage_COL IsLocked="0" />
      </MTZAPP>
    </MTZAPP_COL>
...
</APPLICATION>
</root>


style.xsl
<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

  <html>
  <body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">
  <h1><xsl:value-of select="root/APPLICATION/@NAME"/> </h1>
    <table border="1">
      <tr>
        <td>ID</td>
        <td>Deleted</td>
        <td>IsLocked</td>
        <td>RetriveTime</td>
        <td>ChangeTime</td>
        <td>AccessTime</td>
        <td>SecureStyleID</td>
        <td>Name</td>
        <td>DBName</td>
        <td>TheComment</td>
      </tr>
      <xsl:for-each select="root/APPLICATION/MTZAPP_COL/MTZAPP">
      <tr>
        <td><xsl:value-of select="@ID"/></td>
        <td><xsl:value-of select="@Deleted"/></td>
        <td><xsl:value-of select="@IsLocked"/></td>
        <td><xsl:value-of select="@RetriveTime"/></td>
        <td><xsl:value-of select="@ChangeTime"/></td>
        <td><xsl:value-of select="@AccessTime"/></td>
        <td><xsl:value-of select="@SecureStyleID"/></td>
        <td><xsl:value-of select="@Name"/></td>
        <td><xsl:value-of select="@DBName"/></td>
        <td><xsl:value-of select="@TheComment"/></td>
      </tr>
      </xsl:for-each>
    </table>
</body>
</html>

</xsl:template>
</xsl:stylesheet>


Получилось так :
5c98d44985846575982481.png
В файле test.xml где-то 7500 строк, остальные данные отличаются от показанных выше и выглядят, например, так:
<OBJECTMODE_COL IsLocked="0">
          <OBJECTMODE ID="67a2da64-1444-4e9f-9c60-89923b4bcc6d" Deleted="False" IsLocked="0" RetriveTime="636886970732723806" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" Name="edit" DefaultMode="0" TheComment="редактирование">
            <STRUCTRESTRICTION_COL IsLocked="0" />
            <METHODRESTRICTION_COL IsLocked="0" />
            <FIELDRESTRICTION_COL IsLocked="0" />
          </OBJECTMODE>
          <OBJECTMODE ID="96c54a86-ef5e-4168-b26d-b9858dacf7b6" Deleted="False" IsLocked="0" RetriveTime="636886970732723806" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" Name="read" DefaultMode="-1" TheComment="только чтение,  основной">
            <STRUCTRESTRICTION_COL IsLocked="0">
              <STRUCTRESTRICTION ID="07195bc3-703a-4e10-9d6c-bbcd5c031834" Deleted="False" IsLocked="0" RetriveTime="636886970732983101" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" Struct="4a5cf015-c18d-4149-b965-806ff5beb13a" AllowRead="-1" AllowAdd="0" AllowEdit="-1" AllowDelete="0" />
            </STRUCTRESTRICTION_COL>
            <METHODRESTRICTION_COL IsLocked="0" />
            <FIELDRESTRICTION_COL IsLocked="0">
              <FIELDRESTRICTION ID="1d371bad-9e08-405e-94f1-30d22f0a20e3" Deleted="False" IsLocked="0" RetriveTime="636886970733032974" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" ThePart="4a5cf015-c18d-4149-b965-806ff5beb13a" TheField="91fb40df-4f94-4ede-b63d-040ab311b8b2" AllowRead="-1" AllowModify="0" MandatoryField="0" />
              <FIELDRESTRICTION ID="aa91eac0-fa3a-413b-9a91-47d5cc72d68f" Deleted="False" IsLocked="0" RetriveTime="636886970733032974" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" ThePart="4a5cf015-c18d-4149-b965-806ff5beb13a" TheField="0dcf3edc-c76e-4e6f-842a-59093fa7c48e" AllowRead="-1" AllowModify="0" MandatoryField="0" />
              <FIELDRESTRICTION ID="b5d3b2e6-dc7d-40ec-9428-d727a56c541e" Deleted="False" IsLocked="0" RetriveTime="636886970733032974" ChangeTime="599264352000000000" AccessTime="599264352000000000" SecureStyleID="00000000-0000-0000-0000-000000000000" ThePart="4a5cf015-c18d-4149-b965-806ff5beb13a" TheField="f98c660f-53f3-42f2-af1b-0f70e0ec5a70" AllowRead="-1" AllowModify="0" MandatoryField="0" />
            </FIELDRESTRICTION_COL>
          </OBJECTMODE>


Нужно для всех элементов отдельно составлять таблицы в style.xsl или есть какой-то более простой и удобный способ ?
  • Вопрос задан
  • 268 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Roman-Fov
Если отличается структурой элемент, то придётся обрабатывать отдельно.
Если есть общие черты, то можно вместе. Перечисляйте их в apply-templates select и template match.

XML
https://pastebin.com/DeN4rRnY

XSLt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/root/APPLICATION">
    <html>
    <body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">
    <h1><xsl:value-of select="root/APPLICATION/@NAME"/> </h1>
      <table border="1">
        <tr>
          <td>ID</td>
          <td>Deleted</td>
          <td>IsLocked</td>
          <td>RetriveTime</td>
          <td>ChangeTime</td>
          <td>AccessTime</td>
          <td>SecureStyleID</td>
          <td>Name</td>
          <td>DBName</td>
          <td>TheComment</td>
        </tr>
        <xsl:apply-templates select="MTZAPP_COL/MTZAPP | OBJECTMODE_COL/OBJECTMODE"/>
      </table>
  </body>
  </html>
  </xsl:template>

  <xsl:template match="MTZAPP_COL/MTZAPP | OBJECTMODE_COL/OBJECTMODE">
    <tr>
      <td><xsl:value-of select="@ID"/></td>
      <td><xsl:value-of select="@Deleted"/></td>
      <td><xsl:value-of select="@IsLocked"/></td>
      <td><xsl:value-of select="@RetriveTime"/></td>
      <td><xsl:value-of select="@ChangeTime"/></td>
      <td><xsl:value-of select="@AccessTime"/></td>
      <td><xsl:value-of select="@SecureStyleID"/></td>
      <td><xsl:value-of select="@Name"/></td>
      <td><xsl:value-of select="@DBName"/></td>
      <td><xsl:value-of select="@TheComment"/></td>
    </tr>
  </xsl:template>
</xsl:stylesheet>


Result
https://pastebin.com/PizDCL0M

PS циклы в XSLt не есть хорошо. Те я хочу сказать, что нужно избегать циклов в пользу apply templates везде, где это возможно. Они усложняют таблицы, делают невозможным повторное использование и вообще противоречит идеологии инструмента
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы