Как преобразовать XML, комбинируя старые узлы и генерируя новые элементы UUID - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть следующий XML-файл

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dictionaryEntry type="CM_Vserver">
    <uuid>27bfb32f-baa1-4571-abb5-c644c132ceea</uuid>
    <object-attributes>
        <object-attribute type="String" naturalKey="false" name="admin_state">
            <description>some text</description>
        </object-attribute>
    </object-attributes>
    <object-references>
        <object-reference refCol="cluster_id" naturalKey="true" name="cluster">
            <type>49f5f09e-dcae-4922-98aa-0b4a58f27fda</type>
            <description>some text</description>
        </object-reference>
    </object-references>
</dictionaryEntry>

, и я хотел бы преобразовать его в следующий XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dictionaryEntry type="CM_Vserver">
    <uuid>27bfb32f-baa1-4571-abb5-c644c132ceea</uuid>
    <dictionary-entry-properties>
        <dictionary-entry-property xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="objectAttribute" attributeType="String" name="admin_state" naturalKey="false">
            <uuid>9ccbbd60-0e62-4ae7-b158-e6825441f987</uuid>
            <description>some text</description>
        </dictionary-entry-property>
        <dictionary-entry-property xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="objectReference" referredColumn="cluster_id" name="cluster" naturalKey="true">
            <uuid>afa8c22d-5af9-424e-af6d-106ad96dadbd</uuid>
            <referenceType>49f5f09e-dcae-4922-98aa-0b4a58f27fda</referenceType>
            <description>some text</description>
        </dictionary-entry-property>
    </dictionary-entry-properties>
</dictionaryEntry>

Обратите внимание, что мне нужно внести следующие изменения:

  1. Переименование атрибута объекта в свойство словаря-записи
  2. Переименование ссылки на объект в свойство словаря-записи
  3. Переименование ссылок на объект / ссылка на объект / типinto referenceType
  4. Объединение ex-ссылок на объекты и ex-ссылок на объекты в одном узле с именем dictionary-entry-properties
  5. Создание UUID для каждой ссылки на объект

Спасибозаранее.

1 Ответ

0 голосов
/ 22 мая 2012

Прежде чем я отвечу, необходимо согласовать две вещи:

Во-первых: вы не описали все изменения, которые появляются в желаемом 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...