У меня есть вход xml файл о структуре:
<TabularXml>
<Sheet>
<Row srcidx="2">
<Cell srcidx="1" name="A" type="String">A1</Cell>
<Cell srcidx="2" name="B" type="String">a1</Cell>
<Cell srcidx="3" name="C" type="Decimal">1.2</Cell>
</Row>
<Row srcidx="3">
<Cell srcidx="1" name="A" type="String">A1</Cell>
<Cell srcidx="2" name="B" type="String">a2</Cell>
<Cell srcidx="3" name="C" type="Decimal">0.5</Cell>
</Row>
<Row srcidx="4">
<Cell srcidx="1" name="A" type="String">A2</Cell>
<Cell srcidx="2" name="B" type="String">b1</Cell>
<Cell srcidx="3" name="C" type="Decimal">1.3</Cell>
</Row>
<Row srcidx="5">
<Cell srcidx="1" name="A" type="String">A3</Cell>
<Cell srcidx="2" name="B" type="String">c1</Cell>
<Cell srcidx="3" name="C" type="Decimal">1.8</Cell>
</Row>
<Row srcidx="6">
<Cell srcidx="1" name="A" type="String">A3</Cell>
<Cell srcidx="2" name="B" type="String">c2</Cell>
<Cell srcidx="3" name="C" type="Decimal">0.2</Cell>
</Row>
<Row srcidx="7">
<Cell srcidx="1" name="A" type="String">A3</Cell>
<Cell srcidx="2" name="B" type="String">c3</Cell>
<Cell srcidx="3" name="C" type="Decimal">1.1</Cell>
</Row>
</Sheet>
</TabularXml>
И я хочу вывод:
<Beholdninger xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AntalPoster>3</AntalPoster>
<AllePoster>
<EnPost>
<A>A1</A>
<Papirer>
<Papir>
<B>a1</B>
<C>1.2</C>
</Papir>
<Papir>
<B>a2</B>
<C>0.5</C>
</Papir>
</Papirer>
</EnPost>
<EnPost>
<A>A2</A>
<Papirer>
<Papir>
<B>b1</B>
<C>1.3</C>
</Papir>
</Papirer>
</EnPost>
<EnPost>
<A>A3</A>
<Papirer>
<Papir>
<B>c1</B>
<C>1.8</C>
</Papir>
<Papir>
<B>c2</B>
<C>0.2</C>
</Papir>
<Papir>
<B>c3</B>
<C>1.1</C>
</Papir>
</Papirer>
</EnPost>
</AllePoster>
</Beholdninger>
Мой текущий код xslt:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="a-group" match="Row" use="Cell[@name = 'A']"/>
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Sheet">
<Beholdninger>
<xsl:variable name="group-heads" select="Row[generate-id() = generate-id(key('a-group', Cell[@name = 'A'])[1])]"/>
<AntalPoster><xsl:value-of select="count($group-heads)"/></AntalPoster>
<AllePoster>
<xsl:apply-templates select="$group-heads"/>
</AllePoster>
</Beholdninger>
</xsl:template>
<xsl:template match="Row">
<EnPost>
<A><xsl:value-of select="Cell[@name = 'A']"/></A>
<Papirer>
<xsl:apply-templates select="key('a-group', Cell[@name = 'A'])/Cell[@name = 'B'] | key('a-group', Cell[@name = 'A'])/Cell[@name = 'C']"/>
</Papirer>
</EnPost>
</xsl:template>
<xsl:template match="Cell[@name = 'B']" name="B">
<B><xsl:value-of select="."/></B>
</xsl:template>
<xsl:template match="Cell[@name = 'C']" name="C">
<C><xsl:value-of select="."/></C>
</xsl:stylesheet>
Где я получил:
<Beholdninger xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AntalPoster>3</AntalPoster>
<AllePoster>
<EnPost>
<A>A1</A>
<Papirer>
<B>a1</B>
<C>1.2</C>
<B>a2</B>
<C>0.5</C>
</Papirer>
</EnPost>
<EnPost>
<A>A2</A>
<Papirer>
<B>b1</B>
<C>1.3</C>
</Papirer>
</EnPost>
<EnPost>
<A>A3</A>
<Papirer>
<B>c1</B>
<C>1.8</C>
<B>c2</B>
<C>0.2</C>
<B>c3</B>
<C>1.1</C>
</Papirer>
</EnPost>
</AllePoster>
</Beholdninger>
Я попытался l oop дополнительный шаблон для добавления <Papir></Papir>
узлов и использования функции apply-templates
и нового ключа и группировки, но мне не удалось.
Как это можно решить? Или, может быть, мне нужно переписать скрипт с самого начала и подойти к нему иначе?