Свести таблицу XML в HTML - PullRequest
6 голосов
/ 18 сентября 2008

Должен быть общий способ преобразования некоторых иерархических XML, таких как:

<element1 A="AValue" B="BValue">
   <element2 C="DValue" D="CValue">
      <element3 E="EValue1" F="FValue1"/>
      <element3 E="EValue2" F="FValue2"/>
   </element2>
   ...
</element1>

в плоский XML (html), выбирая выбранные атрибуты по пути и предоставляя различные метки для атрибутов, которые становятся заголовками столбцов.

<table>
   <tr>
     <th>A_Label</th>
     <th>D_Label</th>
     <th>E_Label</th>
     <th>F_Label</th>
   </tr>
   <tr>
     <td>AValue</td>
     <td>DValue</td>
     <td>EValue1</td>
     <td>FValue1</td>
   </tr>
   <tr>
     <td>AValue</td>
     <td>DValue</td>
     <td>EValue2</td>
     <td>FValue2</td>
   </tr>
<table>

ОК, так что нет универсального решения из-за перемаркировки атрибута, но вы понимаете, что я имею в виду, надеюсь. Я только начал изучать все, что связано с XSLT / XPATH, поэтому я разберусь с ним вовремя, но любые подсказки будут полезны.

Ответы [ 5 ]

5 голосов
/ 18 сентября 2008

Я не на 100% уверен в том, что вы пытаетесь сделать, но это решение может сработать, если ваши element1, element2 и element3 вложены последовательно.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <table>
            <xsl:apply-templates select="//element3"></xsl:apply-templates>
        </table>
    </xsl:template>

    <xsl:template match="element3">
        <tr>
            <td><xsl:value-of select="../../@A"/></td>
            <td><xsl:value-of select="../../@B"/></td>
            <td><xsl:value-of select="../@C"/></td>
            <td><xsl:value-of select="../@D"/></td>
            <td><xsl:value-of select="@E"/></td>
            <td><xsl:value-of select="@F"/></td>
        </tr>
        <xsl:apply-templates select="*"></xsl:apply-templates>
    </xsl:template>

</xsl:stylesheet>
1 голос
/ 02 августа 2012

Мне нужен был аналогичный XSLT, но с неизвестной глубиной, вот как я это сделал.

Сначала добавьте обертку для результирующего списка таблиц HTML / def и вызовите шаблон mode = "puke", чтобы выровнять наше дерево XML:

<xsl:element name="div">
    <xsl:attribute name="class" select="puke" />
    <xsl:apply-templates select="$notice" mode="puke" />
</xsl:element>  

Здесь мы сопоставляем каждый узел для отображения его содержимого (например, text ()) и его атрибутов. Мы делаем это рекурсивно. Я использовал dl / dt / dd, потому что мое исходное дерево было сложным деревом, которое не может быть сплющено как.

<!-- @description: 
    Display all field from the notice so the customer can tell what he want
-->
<xsl:template match="node()" mode="puke">
<xsl:message>
    puking : <xsl:value-of select="local-name( . )" />
</xsl:message>
    <xsl:element name="dl">
        <xsl:element name="dt">
            <xsl:attribute name="class">tagName</xsl:attribute> 
            <xsl:value-of select="local-name( . )" />
        </xsl:element>
        <xsl:element name="dd">
            <xsl:attribute name="class">tagText</xsl:attribute>
            <xsl:value-of select="text()" /></xsl:element> 
        <xsl:element name="dl">
            <xsl:attribute name="class">attr</xsl:attribute>
            <!-- display attribute -->
            <xsl:apply-templates select="@*" />
        </xsl:element>
    </xsl:element>
    <!-- recursive call on node() -->
    <xsl:apply-templates select="./*" mode="puke" />    
</xsl:template>

Соответствует атрибуту данного узла и отображает их.

Использование CSS для форматирования полученного HTML:

<style>
.puke {
    background-color: #BDD6DE;
    clear: both;
}
.tagName, .attrName {
    float: left;
}
.tagText, .attrText {
    clear: right;
}
</style>
0 голосов
/ 18 сентября 2008

Я использовал расширенную версию шаблона ниже, чтобы сгладить структурированный XML. Предупреждение: в исходной версии был какой-то специфичный для конкретного случая код (он фактически превратил XML в CSV), который я только что удалил и не тестировал эту версию.

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

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

<!-- XSL template to flatten structured XML, before converting to CSV. -->
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

    <xsl:strip-space elements="*" /> 

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

    <xsl:template match="//yourElementsToFlatten">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:choose>
            <!-- If the element has multiple childs, call this template 
                on its children to flatten it-->
            <xsl:when test="count(child::*) > 0">
                <xsl:apply-templates select="@*|node()"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:value-of select="text()" />
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>
0 голосов
/ 18 сентября 2008

Необходимо уточнить исходный вопрос:

  • Что происходит с BValue и CValue в исходном вопросе? Есть ли причина, по которой они не должны быть частью уплощенной структуры?
  • Все ли элементы в документе XML имеют 2 атрибута или это совершенно произвольно?
  • Есть только 3 типа элементов и они всегда вложены, как показано в примере?
  • Может ли ваш элемент1 повторяться или это корневой элемент вашего документа?

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

0 голосов
/ 18 сентября 2008

У нас уже есть программа Pro * C, считывающая данные из базы данных Oracle, она вызывает скрипт perl, который, в свою очередь, выполняет некоторую Java для извлечения данных в формате XML из вышеупомянутой базы данных для вызова пакетного файла для выполнения некоторого vbscript FTP-файла файла на какой-то другой сервер. Я действительно надеялся на что-то в Фортране.

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