Вы хорошо начали с использования шаблона идентификации. Все, что вам нужно сделать сейчас, это добавить шаблоны, которые соответствуют узлам, которые вы хотите изменить. XSLT имеет концепцию приоритета шаблона, поэтому, если два шаблона соответствуют данному узлу, используется шаблон с более высоким приоритетом. (Шаблон, соответствующий конкретному имени узла, например, «ref», имеет приоритет 0, по сравнению с шаблоном, соответствующим «node ()», который имеет приоритет -0,5)
Итак, чтобы преобразовать ref
, вы бы сделали это ...
<xsl:template match="ref">
<xsl:copy>
<xsl:attribute name="id">
<xsl:value-of select="." />
</xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
Или, что еще лучше, используйте Шаблоны значений атрибутов и сделайте следующее:
<xsl:template match="ref">
<ref id="{.}">
<xsl:apply-templates select="@*|node()"/>
</ref>
</xsl:template>
Вы бы сделали что-то подобное для mail
(хотя немного проще, поскольку значение не является динамическим)
Попробуйте это XSLT
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="mail">
<mail type="email">
<xsl:apply-templates select="@*|node()"/>
</mail>
</xsl:template>
<xsl:template match="ref">
<ref id="{.}">
<xsl:apply-templates select="@*|node()"/>
</ref>
</xsl:template>
</xsl:transform>