/ / xml from excel z 3 identycznymi grupami - konwersja do jednej powtarzającej się grupy - xml, excel, xslt

xml z programu Excel z 3 identycznymi grupami - przekonwertuj do jednej powtarzającej się grupy - xml, excel, xslt

Jestem nowicjuszem w XML i XSLT. Szukałem czegoś podobnego na forum bez powodzenia. Czy możliwe jest następujące tłumaczenie z XSLT? Jest to w zasadzie XML pochodzący z arkusza kalkulacyjnego Excel, który ma 3 grupy, które są identyczne powtarzane w tym samym wierszu, więc mają różne nazwy, grupy 1, ... 2 i ... 3, które chcę przekształcić w jedną grupę powtarzaną 3 razy, jeśli są w nich dane. Poniższy przykład to wersja uproszczona:

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

Konwertuj na

<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 nie nadaje się do eksportu do XML w jakikolwiek inny, ale najprostszy sposób.

Odpowiedzi:

0 dla odpowiedzi № 1

Jednym z arkuszy stylów może być:

<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>

Wydajność:

<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 dla odpowiedzi nr 2

Xslt ma position() funkcjonować. To powinno pomóc ci uzyskać numer przed nazwą.

Mam nadzieję że to pomoże.