Кто-нибудь может дать мне парадигму преобразования шаблона схемы 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
- Использование преобразования идентификации для копирования входного документа как есть и переопределения элементов в соответствии с требованиями.