преобразование с помощью xsl шаблона схемы xml в другой шаблон схемы xml - PullRequest
1 голос
/ 14 июня 2011

Может кто-нибудь дать мне парадигму преобразования шаблона схемы XML, например

    <xs:element name="carareWrap">
    <xs:annotation>
      <xs:documentation xml:lang="en">The CARARE wrapper element. It wraps CARARE elements.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" ref="carare"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

в другой шаблон XML-схемы с xsl? другая XML-схема может быть чем угодно. Мне просто нужно что-то начать с ...

Ответы [ 2 ]

1 голос
/ 14 июня 2011

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

Схема XML - это просто документ XML с объявленным пространством имен uri http://www.w3.org/2001/XMLSchema. Поэтому вы можете применять XSLT как обычно.

Например, у вас есть схема источника, подобная этой:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="carareWrap">
    <xs:annotation>
        <xs:documentation xml:lang="en">The CARARE wrapper element. It wraps CARARE elements.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
        <xs:sequence>
            <xs:element minOccurs="1" maxOccurs="unbounded" ref="carare"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

И (например) вы хотите удалить атрибуты только ссылочных элементов. Вы можете применить следующее преобразование:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="1.0">

    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="xs:element[@ref]">
        <xsl:copy>
            <xsl:copy-of select="@ref"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

Результат будет:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="carareWrap">
        <xs:annotation>
            <xs:documentation xml:lang="en">The CARARE wrapper element. It wraps CARARE elements.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="carare" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Примечание

  • Необходимость объявления пространства имен входного документа в XSLT
  • Использование преобразования идентификации для копирования входного документа как есть и переопределения элементов в соответствии с требованиями.
0 голосов
/ 14 июня 2011

Нет ничего особенного в отслеживании документов XSD.Это просто XML.

Поскольку вы не указываете какие изменения вы хотите внести, вот пример таблицы стилей XSLT, которая меняет случайную деталь (в данном случае значение minOccurs))

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <!-- the identity template copyies everything as-is -->
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
  </xsl:template>

  <!-- ...unless there is a more specific template available -->
  <xsl:template match="
    xs:element[@name = 'carareWrap']//xs:element[@ref = 'carare' and @minOccurs = 1]/@minOccurs
  ">
    <xsl:attribute name="{name()}">2</xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

Вывод

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="carareWrap">
    <xs:annotation>
      <xs:documentation xml:lang="en">The CARARE wrapper element. It wraps CARARE elements.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="2" maxOccurs="unbounded" ref="carare"></xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Несколько замечаний:

  • объявление пространства имен xmlns:xs="http://www.w3.org/2001/XMLSchema", поэтому префикс xs доступен втаблица стилей XSLT
  • использование шаблона идентификации копирует все, что не обрабатывается иначе
  • использование выражения сложного соответствия для выбора определенного узла
  • использование шаблон значения атрибута и функция name() для копирования имени атрибута: name="{name()}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...