XML из Excel с 3 одинаковыми группами - преобразовать в одну повторяющуюся группу - PullRequest
0 голосов
/ 03 мая 2011

Я новичок в XML и XSLT. Я искал что-то подобное на форуме без успеха. Возможен ли последующий перевод с XSLT? В основном это XML, полученный из электронной таблицы Excel, в которой есть 3 одинаковые группы, повторяющиеся в одной строке, поэтому они имеют разные имена, group1,… 2 и… 3, которые я хочу сделать в одну группу, повторенную 3 раза, если в них есть данные. Пример ниже представляет собой упрощенную версию:

<application> 
    <group1>
        <name1>John</name1>
    </group1>
    <group2>
        <name2>Mary</name2>
    </group2>
    <group3>
        <name3>Peter</name3>
    </group3>
</application> 

конвертировать в

<application> 
    <group ref="001">
        <line_no>001</line_no>
        <name>John</name>
    </group>
    <group ref="002">
        <line_no>002</line_no>
        <name>Mary</name>
    </group>
    <group ref="003">
        <line_no>003</line_no>
        <name>Peter</name>
    </group>
</application> 

Excel не поддается экспорту в XML любым, кроме самого простого способа.

Ответы [ 2 ]

0 голосов
/ 03 мая 2011

Одна таблица стилей может быть:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[starts-with(name(),'group')]">
        <group ref="{format-number(substring-after(name(),'group'),'000')}">
            <xsl:apply-templates/>
        </group>
    </xsl:template>
    <xsl:template match="*[starts-with(name(),'name')]">
        <line_no>
            <xsl:value-of
             select="format-number(substring-after(name(),'name'),'000')"/>
        </line_no>
        <name>
            <xsl:apply-templates/>
        </name>
    </xsl:template>
</xsl:stylesheet>

Выход:

<application>
    <group ref="001">
        <line_no>001</line_no>
        <name>John</name>
    </group>
    <group ref="002">
        <line_no>002</line_no>
        <name>Mary</name>
    </group>
    <group ref="003">
        <line_no>003</line_no>
        <name>Peter</name>
    </group>
</application>
0 голосов
/ 03 мая 2011

Xslt имеет функцию position().Это должно помочь вам получить номер перед именем.

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

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