Сначала прочитайте преобразование i dentity в XSLT, которое включает этот шаблон
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
(Если бы вы могли использовать XSLT 3.0, вы могли бы просто написать <xsl:mode on-no-match="shallow-copy"/>
вместо этого)
Это скопирует все ваши узлы и атрибуты «как есть», что в вашем случае приведет вас почти к этому.
Существует несколько способов преобразования нужных вам узлов.Одним из способов является сопоставление тега ComponentDetails
для создания нового ComponentType
в выводе вместе с кодом для выбора других дочерних узлов.
<xsl:template match="ComponentDetails">
<xsl:copy>
<ComponentType ID="{ComponentType}">
<xsl:apply-templates />
</ComponentType>
</xsl:copy>
</xsl:template>
При этом используется Значение атрибутаШаблоны для создания атрибута ID
.
Обратите внимание, что <xsl:apply-templates />
является сокращением для <xsl:apply-templates select="node()" />
, и поэтому он все равно выберет существующий элемент ComponentType
во входном документе, который будетзатем сопоставить с шаблоном идентификации.Чтобы прекратить вывод ComponentType
дважды, необходимо добавить соответствующий шаблон и проигнорировать его.
<xsl:template match="ComponentType" />
Попробуйте это XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" html-version="5"/>
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ComponentDetails">
<xsl:copy>
<ComponentType ID="{ComponentType}">
<xsl:apply-templates />
</ComponentType>
</xsl:copy>
</xsl:template>
<xsl:template match="ComponentType" />
</xsl:stylesheet>