XML в HTML Преобразование с использованием XSL, но без дублирования - PullRequest
0 голосов
/ 19 июня 2020

не новичок в HTML, но я новичок в XML в HTML через XSL (и терминологию).

В настоящее время я конвертирую тысячи старых файлов MathCAD, и процесс выдает xml файл, содержащий примерно следующее (он меняется от файла к файлу):

<?xml version="1.0" encoding="utf-8"?>
<ConversionLog Date="19/06/2020 16:16:36">
    <WorksheetData SourceVersion="13" Source="D:\test.xmcd" Destination="D:\test.mcdx" />
    <Worksheet SourceRegionCount="495" WorksheetIssueCount="0" RegionsWithIssueCount="61">
        <IssueGroup Category="Unsupported Formatting" Count="1">
            <ConversionIssue Count="1" Text="Font formatting (subscript) was lost during conversion." />
        </IssueGroup>
        <IssueGroup Category="Display Differences" Count="60">
            <ConversionIssue Count="60" Text="The display of this operator has changed from the source worksheet. The accuracy of the results is not affected." />
        </IssueGroup>
        <IssueGroup Category="Calculation Differences" Count="2">
            <ConversionIssue Count="2" Text="The conversion has changed the math font. Upon recalculation, check that your results have not changed." />
        </IssueGroup>
    </Worksheet>
</ConversionLog>

Я создал следующий xsl для его преобразования:

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

    <xsl:template match="*">
        <table BORDER="1">
            <xsl:element name="{name()}">
                <xsl:for-each select="@*">
                    <xsl:element name="{name()}">
                        <tr>
                            <td width="175px" bgcolor="#9acd32"><xsl:value-of select="name()"/></td>
                            <td><xsl:value-of select="."/></td>
                        </tr>
                        <br/>
                    </xsl:element>
                </xsl:for-each>
                <xsl:apply-templates select="*|text()"/>
            </xsl:element>
        </table>
    </xsl:template>
</xsl:stylesheet>

1 Я хотел бы знаете, как объединить все атрибуты в теге элемента IssueGroup? (чтобы все было в одной таблице, и у меня не было дубликата атрибута count, если это возможно)

2 как мне добавить небольшой промежуток между разными таблицами, используя тег добавляет массивный пробел? Могу ли я использовать тег заполнения?

спасибо

Формат

1 Ответ

1 голос
/ 23 июня 2020

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

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html" indent="yes" version="5.0"/>
    
    <xsl:template match="/">
        <table BORDER="1">
            <xsl:apply-templates/>
        </table>
    </xsl:template>
    
    <xsl:template match="ConversionLog">
        <tr>
            <td bgcolor="grey" colspan="2">General Information</td>
        </tr>
        <tr>
            <td width="175px" bgcolor="#9acd32">Date</td>
            <td><xsl:value-of select="@Date"/></td>
        </tr>
        <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match="WorksheetData">
        <tr>
            <td bgcolor="grey" colspan="2">Worksheet Data</td>
        </tr>
        <tr>
            <td width="175px" bgcolor="#9acd32">SourceVersion</td>
            <td><xsl:value-of select="@SourceVersion"/></td>
        </tr>
        <tr>
            <td width="175px" bgcolor="#9acd32">Source</td>
            <td><xsl:value-of select="@Source"/></td>
        </tr>
        <tr>
            <td width="175px" bgcolor="#9acd32">Destination</td>
            <td><xsl:value-of select="@Destination"/></td>
        </tr>
    </xsl:template>
    
    <xsl:template match="Worksheet">
        <tr>
            <td bgcolor="grey" colspan="2">Worksheet</td>
        </tr>
        <tr>
            <td width="175px" bgcolor="#9acd32">SourceRegionCount</td>
            <td><xsl:value-of select="@SourceRegionCount"/></td>
        </tr>
        <tr>
            <td width="175px" bgcolor="#9acd32">WorksheetIssueCount</td>
            <td><xsl:value-of select="@WorksheetIssueCount"/></td>
        </tr>
        <tr>
            <td width="175px" bgcolor="#9acd32">RegionsWithoutIssueCount</td>
            <td><xsl:value-of select="@RegionsWithIssueCount"/></td>
        </tr>
        <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match="IssueGroup">
        <xsl:if test="not(preceding-sibling::IssueGroup)">
            <tr>
                <td bgcolor="grey" colspan="2">Issues</td>
            </tr>
        </xsl:if>
        <tr>
            <td bgcolor="lightgrey" colspan="2">Issue <xsl:value-of select="count(preceding-sibling::IssueGroup)+1"/></td>
        </tr>
        <tr>
            <td width="175px" bgcolor="#9acd32">Category</td>
            <td><xsl:value-of select="@Category"/></td>
        </tr>
        <tr>
            <td width="175px" bgcolor="#9acd32">Count</td>
            <td><xsl:value-of select="@Count"/></td>
        </tr>
        <tr>
            <td width="175px" bgcolor="#9acd32">ConversionIssue Text</td>
            <td><xsl:value-of select="ConversionIssue/@Text"/></td>
        </tr>
    </xsl:template>
    
</xsl:stylesheet>

Посмотрите, как это работает: https://xsltfiddle.liberty-development.net/93dFK9u/1

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