У меня есть вход xml файл о структуре:
<TabularXml>
<Sheet>
<Row id="2">
<Cell id="1" name="A" type="String">aaa</Cell>
<Cell id="2" name="B" type="String">1</Cell>
</Row>
<Row id="3">
<Cell id="1" name="A" type="String">aaa</Cell>
<Cell id="2" name="B" type="String">2</Cell>
</Row>
<Row id="3">
<Cell id="1" name="A" type="String">bbb</Cell>
<Cell id="2" name="B" type="String">3</Cell>
</Row>
<Row id="4">
<Cell id="1" name="A" type="String">ccc</Cell>
<Cell id="2" name="B" type="String">4</Cell>
</Row>
</Sheet>
</TabularXml>
И я хочу вывод:
<Beholdninger>
<Unique>3</Unique>
<AllePoster>
<A>aaa</A>
<p><B>1<B/></p>
<p><B>2<B/></p>
<A>bbb</A>
<p><B>3<B/></p>
<A>ccc</A>
<p><B>4<B/></p>
</AllePoster>
</Beholdninger>
Мой текущий код xslt:
</msxsl:script>
<xsl:key name="product" match="//Row/Cell[@name = 'A']/text()" use="." />
<xsl:template match="Sheet">
<Beholdninger>
<xsl:for-each select="//Row/Cell[@name = 'A']/text()[generate-id() = generate-id(key('product',.)[1])]">
<xsl:if test="position()=last()">
<Unique><xsl:value-of select="last()"/></Unique>
</xsl:if>
</xsl:for-each>
<AllePoster>
<xsl:for-each select="//Row/Cell[@name = 'A']/text()[generate-id() = generate-id(key('product',.)[1])]">
<A><xsl:value-of select="."/></A>
<xsl:for-each select="key('product',.)">
<xsl:variable select="position()" name='x'/>
<p><B><xsl:value-of select="//Row[@id = $x]/Cell[@name = 'B']"/></B></p>
</xsl:for-each>
</xsl:for-each>
</AllePoster>
</Beholdninger>
</xsl:template>
</xsl:stylesheet>
Где я получаю:
<Beholdninger>
<Unique>3</Unique>
<AllePoster>
<A>aaa</A>
<p><B>1<B/></p>
<p><B>2<B/></p>
<A>bbb</A>
<p><B>1<B/></p>
<A>ccc</A>
<p><B>1<B/></p>
</AllePoster>
</Beholdninger>
Это потому, что функция position()
генерирует индексы с начала каждого уникального <A>
, а не на основе индексов всего входного файла. Как это можно решить? Или, может быть, мне нужно переписать скрипт с самого начала и подойти к нему иначе?