Для таких проблем, как это часто начинается с созданием шаблона идентичности XSLT
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
На своей собственной этой копии всех узлы как есть, это означает, что вам нужно только написать соответствующие шаблоны для узлов вы хотите преобразовать.
Для начала, вы хотите добавить Num атрибут в продукта, так что есть шаблон, соответствующий продукт где вы просто вывести его с атрибутом и продолжить обработку своих детей.
<xsl:template match="product">
<product num="{position()}">
<xsl:apply-templates select="@*|node()"/>
</product>
</xsl:template>
Обратите внимание на использование значения атрибута шаблонов здесь, в создании Num атрибут . В фигурных скобках указано выражение, которое должно быть оценено, а не выводиться буквально.
Затем вы хотите шаблон, чтобы соответствовать детей в продукции элементов, и превратить их в атрибут узлов. Это делается с помощью шаблона, чтобы соответствовать любому такому ребенку, как так
<xsl:template match="product/*">
<attribute name="{local-name()}">
<xsl:apply-templates />
</attribute>
</xsl:template>
Обратите внимание, что <xsl:apply-templates />
может быть заменен <xsl:value-of select="." />
здесь, если вы только когда-либо будешь иметь текстовые узлы в пределах дочерних элементов.
Попробуйте XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="product">
<product num="{position()}">
<xsl:apply-templates select="@*|node()"/>
</product>
</xsl:template>
<xsl:template match="product/*">
<attribute name="{local-name()}">
<xsl:apply-templates />
</attribute>
</xsl:template>
</xsl:stylesheet>
Применительно к вашему XML следующего выводится
<products>
<product num="1">
<attribute name="type">Monitor</attribute>
<attribute name="size">22</attribute>
<attribute name="brand">EIZO</attribute>
</product>
<product num="2">
......
</product>
</products>
Конечно, если делать на самом деле хочет, чтобы включить дочерние элементы в соответствующие атрибуты, в отличии от элементов named "attribute", вы должны использовать команду xsl: attribute. Заменить последний шаблон с этим
<xsl:template match="product/*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
При использовании этого шаблона вместо, следующий вывод (ну, это будет включать в себя продукт 2, если ваш образец имеет дочерние элементы для него!)
<products>
<product num="1" type="Monitor" size="22" brand="EIZO"></product>
<product num="2">
......
</product>
</products>
Просто убедитесь, что вы правильно поняли вопрос: уверены, что вас не просили превратить его в ' '? Это то, что «атрибут» обычно означает в XML. –
keshlam