Преобразование XML в плоский файл с использованием XSLT - PullRequest
0 голосов
/ 28 июня 2011

Мне нужно преобразовать следующий XML в плоский файл с разделителем в виде «|», используя XSLT.

Это мой XML:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?><GeneralLedgerReport targetNamespace="http://www.portal.com/schemas/GLSync" xmlns="http://www.portal.com/schemas/GLSync" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.portal.com/schemas/GLSync brm_gl_data.xsd">
        <SourceSystemID>Germany</SourceSystemID>
        <ReportID>0.0.0.1-697031-1136</ReportID>
        <RevenueType>Unbilled earned</RevenueType>
        <BRM_GL_Segment>.</BRM_GL_Segment>
        <ReportCreatedTime>
                <Year>2013</Year>
                <Month>01</Month>
                <Day>14</Day>
                <Hours>16</Hours>
                <Minutes>2</Minutes>
                <Seconds>3</Seconds>
        </ReportCreatedTime>
        <PeriodStartTime>
                <Year>2012</Year>
                <Month>10</Month>
                <Day>15</Day>
                <Hours>0</Hours>
                <Minutes>0</Minutes>
                <Seconds>0</Seconds>
        </PeriodStartTime>
        <PeriodEndTime>
                <Year>2012</Year>
                <Month>10</Month>
                <Day>16</Day>
                <Hours>0</Hours>
                <Minutes>0</Minutes>
                <Seconds>0</Seconds>
        </PeriodEndTime>
</GeneralLedgerReport>

Обязательный вывод: Отчет в Главной книге

Германия | 0.0.0.1-697031-1136 | Непогашенный заработан | 2013/01 / 14-16: 02: 03 | 2012/10 / 15-00: 00: 00 Германия | 0.0.0.1-697031-1136| Непогашенный заработанный | 2013/01 / 14-16: 02: 03 | 2012/10 / 15-00: 00: 00 Германия | 0.0.0.1-697031-1136 | Непогашенный заработанный | 2013/01 / 14-16: 02:03 | 2012/10 / 15-00: 00: 00 Германия | 0.0.0.1-697031-1136 | Непогашенный заработанный | 2013/01 / 14-16: 02: 03 | 2012/10 / 15-00: 00: 00

Я попробовал несколько вещей, но вывод выглядит так:

Германия0.0.0.1-697031-1136Небилл заработано20130114160203201210150

Нужно срочно, пожалуйста, помогите!Спасибо!

Я новичок в XSLT, не знаю, как получить элементы отдельно с разделителями, я попробовал это:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common"
        xmlns:java="http://xml.apache.org/xalan/java" exclude-result-prefixes="exslt java">
<xsl:output method="text" version="1.0" encoding="ISO-8859-1" indent="yes"/>

        <xsl:template match="/">
          <xsl:apply-templates select="/"/>
        </xsl:template>
        <xsl:template match="/">
           <xsl:value-of  select="."/>
        </xsl:template>

</xsl:stylesheet>

Подробнее XML:

    <SourceSystemID>Germany</SourceSystemID>
    <ReportID>0.0.0.1-697031-1116</ReportID>
    <RevenueType>Unbilled earned</RevenueType>
    <BRM_GL_Segment>.</BRM_GL_Segment>
    <ReportCreatedTime>
            <Year>2013</Year>
            <Month>01</Month>
            <Day>14</Day>
            <Hours>16</Hours>
            <Minutes>1</Minutes>
            <Seconds>59</Seconds>
    </ReportCreatedTime>
    <PeriodStartTime>
            <Year>2012</Year>
            <Month>09</Month>
            <Day>25</Day>
            <Hours>0</Hours>
            <Minutes>0</Minutes>
            <Seconds>0</Seconds>
    </PeriodStartTime>
    <PeriodEndTime>
            <Year>2012</Year>
            <Month>09</Month>
            <Day>26</Day>
            <Hours>0</Hours>
            <Minutes>0</Minutes>
            <Seconds>0</Seconds>
    </PeriodEndTime>
    <SourceSystemID>Germany</SourceSystemID>
    <ReportID>0.0.0.1-697031-1136</ReportID>
    <RevenueType>Unbilled earned</RevenueType>
    <BRM_GL_Segment>.</BRM_GL_Segment>
    <ReportCreatedTime>
            <Year>2013</Year>
            <Month>01</Month>
            <Day>14</Day>
            <Hours>16</Hours>
            <Minutes>2</Minutes>
            <Seconds>3</Seconds>
    </ReportCreatedTime>
    <PeriodStartTime>
            <Year>2012</Year>
            <Month>10</Month>
            <Day>15</Day>
            <Hours>0</Hours>
            <Minutes>0</Minutes>
            <Seconds>0</Seconds>
    </PeriodStartTime>
    <PeriodEndTime>
            <Year>2012</Year>
            <Month>10</Month>
            <Day>16</Day>
            <Hours>0</Hours>
            <Minutes>0</Minutes>
            <Seconds>0</Seconds>
    </PeriodEndTime>

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Попробуйте посмотреть на этот вопрос, но используйте | вместо запятой

XSLT Объединение значений через запятую (,)

0 голосов
/ 28 июня 2011

Вы можете получить вдохновение от следующего XSLT:

<?xml version='1.0' encoding='utf-8'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:glsync="http://www.portal.com/schemas/GLSync" version="1.0">

    <xsl:output method="text" />

    <xsl:template match="glsync:GeneralLedgerReport">
        <xsl:value-of select="./glsync:SourceSystemID" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="./glsync:ReportID" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="./glsync:RevenueType" />
        <xsl:text>|</xsl:text>
        <xsl:apply-templates select="./glsync:ReportCreatedTime" />
        <xsl:text>|</xsl:text>
        <xsl:apply-templates select="./glsync:PeriodStartTime" />
    </xsl:template>

    <xsl:template match="glsync:ReportCreatedTime">
        <xsl:value-of
            select="concat(
                glsync:Year, '/', 
                glsync:Month, '/', 
                glsync:Day, '-', 
                format-number(glsync:Hours, '00'), ':', 
                format-number(glsync:Minutes, '00'), ':', 
                format-number(glsync:Seconds,  '00'))" />
    </xsl:template>

    <xsl:template match="glsync:PeriodStartTime">
        <xsl:value-of
            select="concat(
                glsync:Year, '/', 
                glsync:Month, '/', 
                glsync:Day, '-', 
                format-number(glsync:Hours, '00'), ':', 
                format-number(glsync:Minutes, '00'), ':', 
                format-number(glsync:Seconds,  '00'))" />
    </xsl:template>

</xsl:stylesheet>

Некоторые примечания:

  • вы должны использовать пространство имен в соответствующих элементах, потому что ваш XML имеетtargetNamespace;

  • Вы можете использовать функцию concat также в соответствии с шаблоном glsync:GeneralLedgerReport

  • обратите внимание на использование format-number функция для получения часов, минут и секунд из двух цифр

  • наконец, ваш длинный XML кажется странным, потому что все теги GeneralLedgerReport, ReportCreatedTime, PeriodStartTime и PeriodEndTimeнаходятся на одном уровне;возможно, у вас есть какой-то тег, заключающий их в себе, чтобы у вас были вложенные структуры для каждого GeneralLedgerReport

Надеюсь, это поможет.

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