Мне нужно собрать несколько XSD с (неуказанным) числом вложенных импортов во временную переменную дерева. Преобразование начинается с schema_1.xsd, который, в свою очередь, импортирует несколько других XSD.
Как это: содержание schema_1.xsd:
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd">
<import namespace="http://www.someplace.com" schemaLocation="schema_2.xsd"/>
<import namespace="http://www.someplace.com" schemaLocation="schema_3.xsd"/>
<element name="TopElement1">
<complexType>
<sequence>
<element name="ChildElement1"/>
<element name="ChildElement2"/>
<element name="ChildElement3"/>
</sequence>
</complexType>
</element>
</schema>
и содержимое schema_2.xsd:
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd">
<import namespace="http://www.someplace.com" schemaLocation="schema_3.xsd"/>
<import namespace="http://www.someplace.com" schemaLocation="schema_4.xsd"/>
<element name="TopElement2">
<complexType>
<sequence>
<element name="ChildElement4" minOccurs="0"/>
<element name="ChildElement5"/>
</sequence>
</complexType>
</element>
</schema>
и так далее (я полагаю, включение третьего XSD немного излишне?).
Что мне нужно сделать, так это построить целое временное дерево, содержащее все узлы всех вложенных XSD, включая содержимое первого XSD, т.е. schema_1.xsd. Как видно из XSD, некоторые операции импорта могут происходить дважды. Предпочтительно любая схема должна быть скопирована в нужную переменную только один раз. Что еще хуже, я знаю, что могут быть циклические ссылки, которые явно накладывают дополнительные ограничения на пространство решений.
Мне нужно, чтобы результирующее временное дерево было доступно в переменной в XSLT. Возможно, так:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:variable name="root">
<!-- magic -->
</xsl:variable>
<xsl:template match="/">
<!-- processing $root/fullStructure -->
</xsl:template>
</xsl:stylesheet>
Фактическое содержимое $ root. Я бы хотел выглядеть примерно так:
<fullStructure>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd">
<import namespace="http://www.someplace.com" schemaLocation="schema_2.xsd"/>
<import namespace="http://www.someplace.com" schemaLocation="schema_3.xsd"/>
<element name="TopElement1">
<complexType>
<sequence>
<element name="ChildElement1"/>
<element name="ChildElement2"/>
<element name="ChildElement3"/>
</sequence>
</complexType>
</element>
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd">
<import namespace="http://www.someplace.com" schemaLocation="schema_3.xsd"/>
<import namespace="http://www.someplace.com" schemaLocation="schema_4.xsd"/>
<element name="TopElement2">
<complexType>
<sequence>
<element name="ChildElement4" minOccurs="0"/>
<element name="ChildElement5"/>
</sequence>
</complexType>
</element>
</schema>
<!-- copy-of for schema_3.xsd and schema_4.xsd is omitted for the sake of brevity. -->
</fullStructure>
Размер этого дерева ограничен только количеством импорта и доступными вычислительными ресурсами. Конечно, узлы импорта больше не нужны, однако, они также не представляют проблемы, так что скрытая копия полностью в порядке.
Основное обновление
По просьбе Дмитрия Новатчева, я включил пару действительных XSD, а также описание желаемого результата. Кроме того, я удалил некоторые лишние замечания. Я также сделал несколько небольших обновлений из-за отзывов от LarsH.
Может кто-нибудь дать мне указатель в правильном направлении? Спасибо миллион!