Прежде чем я отвечу, необходимо согласовать две вещи:
Во-первых: вы не описали все изменения, которые появляются в желаемом XML. Например, элемент <dictionary-entry-property>
, кажется, получает ранее отсутствующее пространство имен; Кроме того, некоторые имена атрибутов меняются. Поскольку вы не указываете их в своем списке изменений, я буду их игнорировать; дайте мне знать, что они действительно важны, и я пересмотрю свой ответ.
Второе: вам нужен UUID по какой-то конкретной причине? Или это значение просто должно быть уникальным?
Если вы ответили на первый вопрос, перейдите по этой ссылке, чтобы обсудить, как это можно сделать: XSLT генерирует UUID . В двух словах вам, скорее всего, придется полагаться на внешние методологии, такие как EXSLT библиотека или генерация случайных чисел с помощью FXSL .
Если, с другой стороны, вы ответили на последний вопрос, функция the generate-id()
поможет вам (я использую этот подход в своем ответе). В любом сценарии учтите следующее:
Когда этот XSLT работает с предоставленным вами XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- Identity Template: copies everything as-is -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Add new <dictionary-entry-properties> element to -->
<!-- contain all of our result elements -->
<xsl:template match="dictionaryEntry">
<xsl:copy>
<dictionary-entry-properties>
<xsl:apply-templates/>
</dictionary-entry-properties>
</xsl:copy>
</xsl:template>
<!-- Replace <object-attributes> nodes with -->
<!-- <dictionary-entry-properties> nodes -->
<xsl:template match="object-attributes">
<xsl:apply-templates/>
</xsl:template>
<!-- Replace <object-attribute> and <object-reference> elements -->
<!-- with a new <dictionary-entry-property> element; additionally, -->
<!-- create a <uuid> element with a unique value -->
<xsl:template match="object-attribute | object-reference">
<dictionary-entry-property>
<xsl:apply-templates select="@*"/>
<uuid>
<xsl:value-of select="generate-id()"/>
</uuid>
<xsl:apply-templates/>
</dictionary-entry-property>
</xsl:template>
<!-- Rename <type> elements (with <object-reference> parents -->
<!-- and <object-references> grandparents) to <referenceType> -->
<xsl:template match="object-references/object-reference/type">
<referenceType>
<xsl:apply-templates/>
</referenceType>
</xsl:template>
<!-- <object-references> elements should be removed altogether -->
<xsl:template match="object-references">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
этот XML создается:
<?xml version="1.0" encoding="UTF-8"?>
<dictionaryEntry>
<dictionary-entry-properties>
<uuid>27bfb32f-baa1-4571-abb5-c644c132ceea</uuid>
<dictionary-entry-property type="String" naturalKey="false" name="admin_state">
<uuid>i__21420544_12</uuid>
<description>some text</description>
</dictionary-entry-property>
<dictionary-entry-property refCol="cluster_id" naturalKey="true" name="cluster">
<uuid>i__21420544_25</uuid>
<referenceType>49f5f09e-dcae-4922-98aa-0b4a58f27fda</referenceType>
<description>some text</description>
</dictionary-entry-property>
</dictionary-entry-properties>
</dictionaryEntry>