Добавление родителя в выбранных братьев и сестер с помощью XSLT - PullRequest
0 голосов
/ 19 декабря 2018

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

    <?xml version="1.0" encoding="UTF-8"?>
            <FileHeaderRecord>
                <FormatCode>1</FormatCode>
                <ImmediateDestinationName>MEPS</ImmediateDestinationName
                <CompanyBatchHeader>
                    <OriginatorStatusCode>1</OriginatorStatusCode>
                    <OriginatingFIIdentification>10000214</OriginatingFIIdentification>
                    <BatchNumber>0000004</BatchNumber>
                    <recordvalues>22100002225201198876900</recordvalues>
                    <ammendvalues>23</ammendvalues>
                    <ammendvalues>23439358</ammendvalues>
                    <recordvalues>1100002143439359</recordvalues>
                    <ammendvalues>0013439359</ammendvalues>
                    <ammendvalues>9359</ammendvalues>
                </CompanyBatchHeader>
                <CompanyBatchTrailer>
                  <Sderviceclasscode>220000003</Sderviceclasscode>
                </CompanyBatchTrailer>
            </FileHeaderRecord>  

Я хочу добавить родителя с именем data в значения записей и значений ammend (также CompanyBatchHeader может появляться более одного раза, а также числоammendvalues ​​после того, как значения записи не исправлены) создание выходного файла как:

<?xml version="1.0" encoding="UTF-8"?>
            <FileHeaderRecord>
                <FormatCode>1</FormatCode>
                <ImmediateDestinationName>MEPS</ImmediateDestinationName
                <CompanyBatchHeader>
                    <OriginatorStatusCode>1</OriginatorStatusCode>
                    <OriginatingFIIdentification>10000214</OriginatingFIIdentification>
                    <BatchNumber>0000004</BatchNumber>
                     <data>
                    <recordvalues>22100002225201198876900</recordvalues>
                    <ammendvalues>23</ammendvalues>
                    <ammendvalues>23439358</ammendvalues>
                     </data>
                     <data>
                    <recordvalues>1100002143439359</recordvalues>
                    <ammendvalues>0013439359</ammendvalues>
                    </data>
                </CompanyBatchHeader>
                <CompanyBatchTrailer>
                  <Sderviceclasscode>220000003</Sderviceclasscode>
                </CompanyBatchTrailer>
            </FileHeaderRecord>

Я пробовал несколько xslt, ни один из них не работал так, как я хотел.Пожалуйста, может кто-нибудь помочь мне в этом?

Я попробовал следующее xslt:

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

    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <FileHeaderRecord>

            <xsl:for-each select="FileHeaderRecord/CompanyBatchHeader/recordvalues">
                <xsl:variable name="ammend_count" select="count(preceding-sibling::recordvalues) + 1"/>
                <data>
                    <xsl:copy-of select="."/>
                    <xsl:copy-of select="following-sibling::ammendvalues[count(preceding-sibling::recordvalues) = $ammend_count]"/>
                </data>
            </xsl:for-each>
        </FileHeaderRecord>
    </xsl:template>

</xsl:stylesheet>  

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

1 Ответ

0 голосов
/ 19 декабря 2018

Предполагая, что вы ограничены XSLT 1.0, я бы посоветовал вам попробовать это так.При этом используется ключ , чтобы связать ammendvalues с их ближайшим предшествующим recordvalues родным братом:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="ammend-by-record" match="ammendvalues" use="generate-id(preceding-sibling::recordvalues[1])" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="recordvalues">
    <data>
        <!-- copy self -->
        <xsl:copy-of select="."/>
        <!-- copy adjacent ammendvalues -->
        <xsl:copy-of select="key('ammend-by-record', generate-id())"/>
    </data>
</xsl:template>

<!-- remove ammendvalues at their original location -->
<xsl:template match="ammendvalues"/>

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