Как конвертировать XML в форматированный текстовый файл с помощью XSlt - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть XML-файл, который выглядит так:

<Report>
<Total>
    <RecordValues>
        <Record>
        <FieldValue fieldName="index"       fieldValue="1" />
        <FieldValue fieldName="version"     fieldValue="100" />
        <FieldValue fieldName="user"        fieldValue="tester" />
        <FieldValue fieldName="date_modified"   fieldValue="2010-10-18 12:18:12" />
        <FieldValue fieldName="object_name"     fieldValue="Menu" />
        <FieldValue fieldName="permission"  fieldValue="Permission X" />
        </Record>
        <Record>
        <FieldValue fieldName="index"       fieldValue="2" />
        <FieldValue fieldName="version"     fieldValue="100" />
        <FieldValue fieldName="user"        fieldValue="user1" />
        <FieldValue fieldName="date_modified"   fieldValue="2010-12-15 12:18:12" />
        <FieldValue fieldName="object_name"     fieldValue="Control" />
        <FieldValue fieldName="permission"  fieldValue="Permission E" />
        </Record>
        <Record>
        <FieldValue fieldName="index"       fieldValue="3" />
        <FieldValue fieldName="version"     fieldValue="15" />
        <FieldValue fieldName="user"        fieldValue="user2" />
        <FieldValue fieldName="date_modified"   fieldValue="2010-10-02 12:18:12" />
        <FieldValue fieldName="object_name"     fieldValue="Run" />
        <FieldValue fieldName="permission"  fieldValue="Permission R" />
        </Record>
    </RecordValues>
</Total>

Я должен преобразовать его с помощью XSLT в форматированный текстовый файл:

1 100  101810
tester  Menu       Permission X
2 100  121510
user1   Control    Permission E
3 15   100210
user2   Run        Permission R 

Необходимо использовать только атрибут fieldValue , а все поля в текстовом файле имеют фиксированную длину. Пожалуйста, помогите мне. Спасибо.

Ответы [ 2 ]

5 голосов
/ 03 декабря 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:m="map">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>
    <xsl:variable name="vPadding"
         select="'             &#xA;                               '"/>
    <m:m n="index" p="1"/>
    <m:m n="version" p="3"/>
    <m:m n="user" p="15"/>
    <m:m n="date_modified" p="8"/>
    <m:m n="object_name" p="23"/>
    <m:m n="permission" p="34"/>
    <xsl:template match="Record">
        <xsl:apply-templates select="*[1]"/>
    </xsl:template>
    <xsl:template match="FieldValue">
        <xsl:param name="pOutput" select="$vPadding"/>
        <xsl:variable name="vValue">
            <xsl:apply-templates select="@fieldValue"/>
        </xsl:variable>
        <xsl:variable name="vPos"
                      select="document('')/*/m:m
                                 [@n=current()/@fieldName]/@p"/>
        <xsl:variable name="vOutput"
             select="concat(substring($pOutput,1,$vPos -1),
                            $vValue,
                            substring($pOutput,$vPos+string-length($vValue)))"/>
        <xsl:variable name="vNext" select="following-sibling::*[1]"/>
        <xsl:apply-templates select="$vNext">
            <xsl:with-param name="pOutput" select="$vOutput"/>
        </xsl:apply-templates>
        <xsl:if test="not($vNext)">
            <xsl:value-of select="concat($vOutput,'&#xA;')"/>
        </xsl:if>
    </xsl:template>
    <xsl:template match="@*[../@fieldName='date_modified']">
        <xsl:value-of select="concat(substring(translate(.,'-',''),5,4),
                                     substring(.,3,2))"/>
    </xsl:template>
</xsl:stylesheet>

Выход:

1 100  101810
tester  Menu       Permission X
2 100  121510
user1   Control    Permission E
3 15   100210
user2   Run        Permission R

Примечание : Мелкозернистый обход, дополнительная маска, встроенная карта со значением начальной позиции.

РЕДАКТИРОВАТЬ : на всякий случай убрать пробел ...

0 голосов
/ 04 декабря 2010

Алехандро, я проверил ваше решение.Получил правильный результат.Единственная проблема, которую я вижу здесь, состоит в том, что первая строка не начинается с начала файла, и после каждых двух записей есть пустая строка.Этот файл должен быть хорошо отформатирован.Вот результат:

        1 100  101810
tester  Menu       Permission X

        2 100  121510
user1   Control    Permission E

        3 15   100210
user2   Run        Permission R

Еще раз спасибо за ваш ответ.

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