Генерация метаданных с помощью XSLT - PullRequest
1 голос
/ 11 ноября 2008

Я регулярно создаю схему XSD путем преобразования собственной модели данных унаследованной системы. Это работает довольно хорошо. Однако устаревшая система позволяет мне указывать только базовые атрибуты параметра, такие как тип данных (int, string и т. Д.).

Я хотел бы улучшить XSL-преобразование с помощью механизма, который позволяет мне добавлять метаданные, чтобы предоставить больше деталей для преобразования. Я думал о чем-то вроде нотации свойств Java для назначения атрибутов XPath.

Представьте себе следующий пример:

устаревшая модель данных системы (на самом деле это аккуратно, но лучше всего подходит для демонстрационных целей)

<datamodel>
  <customer>
    <firstName type="string"/>
    <lastName type="string"/>
    <age type="int">
  <customer>
</datamodel>

метаданные

customer/firstName/@nillable=false
customer/lastName/@nillable=false
customer/age/@nillable=true
customer/firstName/@minOccurs=1
customer/firstName/@maxOccurs=1
customer/lastName/@minOccurs=1
customer/lastName/@maxOccurs=1

результирующая XSD-схема

...
<xs:complexType name="customerType">
  <xs:sequence>
    <xs:element name="firstName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="lastName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="age" type="xs:int" nillable="true"/>
  </xs:sequence>
</xs:complexType>
...

Что вы думаете об этом? Есть ли способ включить метаданные в таблицу стилей XSL?

Ответы [ 2 ]

2 голосов
/ 13 ноября 2008

Лучшим решением было бы изменить устаревшие данные, добавив отсутствующие метаданные.

Экземпляр измененного словаря "datamodel" может выглядеть примерно так:

<datamodel xmlns:nm="my:new.meta">
    <customer>
        <firstName type="string"
                   nm:nillable="false"
                   nm:minOccurs="1"
                   nm:maxOccurs="1"
                   />
        <lastName type="string"
                  nm:nillable="false"
                  nm:minOccurs="1"
                  nm:maxOccurs="1"
                  />
        <age type="int" nm:nillable="true"/>
    </customer>
</datamodel>

Помещение новых свойств в отдельное пространство имен - это хороший способ легко отличить их от уже поддерживаемых свойств. Обычно использование атрибутов в пространстве имен не рекомендуется, поэтому, если этого следует избежать, можно использовать подэлементы (принадлежащие новому пространству имен) вместо атрибутов. Если новые атрибуты принадлежат другому пространству имен, это может привести к тому, что устаревшая схема проверки не отклонит их.

Если по каким-либо причинам невозможно изменить устаревшие данные, я бы рекомендовал не включать новые свойства в саму таблицу стилей XSLT (это вполне возможно, например, для определения этого как содержимого глобальной <xsl:variable>), но для предоставления этих новых свойств в виде отдельного файла XML или набора из одного или нескольких файлов XML.

Любой файл XML может быть доступен динамически во время преобразования XSLT с помощью функции document () XSLT. Экземпляр файла XML с новыми свойствами может выглядеть так:

<newProperties xmlns:nm="my:new.meta">
    <customer>
        <firstName nm:nillable="false"
                   nm:minOccurs="1"
                   nm:maxOccurs="1"
                   />
        <lastName nm:nillable="false"
                  nm:minOccurs="1"
                  nm:maxOccurs="1"
                  />
        <age nm:nillable="true"/>
    </customer>
</newProperties>

Надеюсь, это помогло.

Приветствия

Димитр Новатчев

1 голос
/ 11 ноября 2008

«Что вы думаете об этом?»

Две Три вещи.

  1. Исправить устаревшие метаданные. Это XML. Добавьте вещи к этому. Добавьте пространство имен, если вам нужно.

  2. Если вы не можете исправить устаревшие метаданные, кто будет поддерживать второй набор метаданных, которых нет в нотации XML? Кто будет делать двойную запись для изменения метаданных? Какова вероятность того, что кто-либо выполнит?

  3. Рассмотрите возможность использования XML для дополнительных метаданных, а не псевдо-XPath. Последовательность поможет тем, кто придет после того, как вы поймете, что происходит.

...