Разделить рекурсивно Xml на основе элемента узла - PullRequest
0 голосов
/ 24 января 2020

Мне нужна одна помощь в формировании XML через xslt

. Ниже приведен пример ввода

<SampleInput >
    <root >
        <Rows tupleCount="4" >
            <SampleNode name="Header 1" >
                <Group >
                    <Member format="$#,##0" name="HH 1" />
                    <Member format="#,##0" name="HH 2" />
                    <Member format="#,##0" name="HH 3" />
                    <Member format="$#,##0" name="HH 4" />
                </Group>
            </SampleNode>
        </Rows>
        <Columns tupleCount="2" >
            <SampleNode name="Header 2" >
                <Group >
                    <Member name="S1" />
                    <Member name="S2" />
                </Group>
            </SampleNode>
        </Columns>
        <CellValues >
            <Cell >
                <Value >256527.36519492</Value>
            </Cell>
            <Cell >
                <Value >237541088.83536</Value>
            </Cell>
            <Cell >
                <Value >169580.72985033</Value>
            </Cell>
            <Cell >
                <Value >96707259.214039</Value>
            </Cell>
            <Cell >
                <Value >157978.91471716</Value>
            </Cell>
            <Cell >
                <Value >58120531.01539</Value>
            </Cell>
            <Cell >
                <Value >248507.21870366</Value>
            </Cell>
            <Cell >
                <Value >159056981.2623</Value>
            </Cell>
        </CellValues>
    </root>
</SampleInput>

. В приведенном выше примере есть 3 узла с именами «Rows», «Columns». "и" CellValues ​​". исходя из этого, как получить вывод, как показано ниже

<SampleOutput >
    <Results>
        <Column column1="Header 1" column2="S1" column3="S2" />
        <row row1="HH 1" row2="256527.36519492" row3="237541088.83536" />
        <row row1="HH 2" row2="169580.72985033" row3="96707259.214039" />
        <row row1="HH 3" row2="157978.91471716" row3="58120531.01539" />
        <row row1="HH 4" row2="248507.21870366" row3="159056981.2623" />
    </Results>
</SampleOutput>

, как добиться этого через XSLT.

спасибо еще раз.

1 Ответ

0 голосов
/ 24 января 2020

Это хороший беспорядок. Попробуйте что-то вроде:

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:template match="/SampleInput">
    <xsl:variable name="columns" select="root/Columns/@tupleCount" />
    <xsl:variable name="row-members" select="root/Rows/SampleNode/Group/Member" />
    <xsl:variable name="col-members" select="root/Columns/SampleNode/Group/Member" />
    <SampleOutput>
        <Results>
            <!-- header -->
            <Column column1="{root/Rows/SampleNode/@name}">
                <xsl:for-each select="$col-members">
                    <xsl:attribute name="row{position() + 1}">
                        <xsl:value-of select="@name" />
                    </xsl:attribute>
                </xsl:for-each>
            </Column>
            <!-- data -->
            <xsl:for-each select="root/CellValues/Cell[position() mod $columns = 1]">
                <xsl:variable name="row-number" select="position()" />
                <row row1="{$row-members[$row-number]/@name}">
                    <xsl:for-each select=". | following-sibling::Cell[position() &lt; $columns]">
                        <xsl:attribute name="row{position() + 1}">
                            <xsl:value-of select="Value" />
                        </xsl:attribute>
                    </xsl:for-each>
                </row>
            </xsl:for-each>
        </Results>
    </SampleOutput>
</xsl:template>

</xsl:stylesheet>
...