У меня есть следующий пример XML:
<items>
<item>
<item_id>1</item_id>
<item_name>item 1</item_name>
<group_id>1</group_id>
<group_name>group 1</group_name>
</item>
<item>
<item_id>2</item_id>
<item_name>item 2</item_name>
<group_id>1</group_id>
<group_name>group 1</group_name>
</item>
<item>
<item_id>3</item_id>
<item_name>item 3</item_name>
<group_id>2</group_id>
<group_name>group 2</group_name>
</item>
</items>
, который мне нужно преобразовать в следующий формат CSV:
1,item 1
2,item 2
3,item 3
1,group 1
2,group 2
В xml, item_id всегда будет сопровождаться item_name.Имя элемента не всегда будет конкататным ('item_', #).Это может быть описание типа «зубная паста».Элементы никогда не будут повторяться в файле, но иногда сопряжение group_id-> group_name не всегда будет 1-1.В этом случае предпочтительнее использовать первое сопряжение.
Я выполняю это с помощью оператора 'for-each-group', но это выглядит немного странно.Есть ли недостатки этого подхода?Как лучше это сделать?
<xsl:template match="/">
<xsl:call-template name="list_format">
<xsl:with-param name="list" select="'item'"/>
</xsl:call-template>
<xsl:call-template name="list_format">
<xsl:with-param name="list" select="'group'"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="list_format">
<xsl:param name="list"/>
<xsl:variable name="linefeed" select="'
'"></xsl:variable>
<xsl:variable name="list_id" select="concat($list,'_id')"></xsl:variable>
<xsl:variable name="list_name" select="concat($list,'_name')"></xsl:variable>
<xsl:for-each-group select="/items/item" group-by="*[name()=$list_id]">
<xsl:sort select="*[name()=$list_id]"/>
<xsl:value-of select="*[name()=$list_id]"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="*[name()=$list_name]"/>
<xsl:value-of select="$linefeed"/>
</xsl:for-each-group>
</xsl:template>