Я могу преобразовать элементы в атрибуты и поместить их в новый элемент, но родительский элемент повторяется для каждого дочернего элемента.
Xml:
<root>
<function>test</function>
<transaction>
<date>2019-09-24</date>
<user>myuser</user>
<items>
<number>4884624</number>
<unit>EA</unit>
<qty>6</qty>
<barcode/>
<conversion/>
</items>
<items>
<number>4895036</number>
<unit>CS</unit>
<qty>4</qty>
<barcode/>
<conversion/>
</items>
<items>
<number/>
<unit>CS</unit>
<qty>4</qty>
<barcode/>
<conversion/>
</items>
</transaction>
</root>
Xslt:
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/ | node() | @* | comment() | processing-instruction()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="items">
<xsl:copy>
<item>
<xsl:for-each select="*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
</item>
</xsl:copy>
</xsl:template>
</xsl:transform>
Токовый выход:
<root>
<function>test</function>
<transaction>
<date>2019-09-24</date>
<user>myuser</user>
<items>
<item number="4884624" unit="EA" qty="6" barcode="" conversion=""/>
</items>
<items>
<item number="4895036" unit="CS" qty="4" barcode="" conversion=""/>
</items>
<items>
<item number="" unit="CS" qty="4" barcode="" conversion=""/>
</items>
</transaction>
</root>
Желаемый выход:
<root>
<function>test</function>
<transaction>
<date>2019-09-24</date>
<user>myuser</user>
<items>
<item number="4884624" unit="EA" qty="6" barcode="" conversion=""/>
<item number="4895036" unit="CS" qty="4" barcode="" conversion=""/>
<item number="" unit="CS" qty="4" barcode="" conversion=""/>
</items>
</transaction>
</root>