У меня есть большая коллекция файлов XML, которые мне нужно преобразовать с помощью XSLT.Проблема в том, что многие из этих файлов были написаны от руки разными людьми, и они не используют непротиворечивые имена для ссылки на схемы.Например, один файл может использовать:
xmlns:itemType="http://example.com/ItemType/XSD"
, где другой может использовать префикс "it" вместо "itemType":
xmlns:it="http://example.com/ItemType/XSD"
Если это не так уж и плохо, есть несколько файлов, которые используют два или три синонима для одной и той же вещи!
<?xml version="1.0"?>
<Document
xmlns:it="http://example.com/ItemType/XSD"
xmlns:itemType="http://example.com/ItemType/XSD"
xmlns:ItemType="http://example.com/ItemType/XSD"
...
(явно было много операций вырезания и вставки)
Теперь, поскольку сопоставление с образцом в файле XSLT, похоже, работает с префиксом пространства имен (в отличие от схемы, к которой оно относится), шаблон соответствует только одному из вариантов.Поэтому, если я напишу что-то вроде:
<xsl:template match="SomeNode[@xsi:type='itemType:SomeType']">
...
</xsl:template>
, тогда это будет соответствовать только подмножеству дел, которые я хочу.
Вопрос 1: Есть ли способчтобы XSLT соответствовал всем вариантам?
Вопрос 2: Есть ли способ удалить дубликаты, чтобы во всех выходных файлах использовалось согласованное именование?
Я наивнопопытался использовать "псевдоним пространства имен", но я думаю, что я неправильно понял, что это делает, потому что я не могу заставить его вообще что-либо делать - либо сопоставить все варианты, либо повлиять на выходной XML.
<?xsl:stylesheet
version="1.0"
...
xmlns:it="http://example.com/ItemType/XSD"
xmlns:itemType="http://example.com/ItemType/XSD"
xmlns:ItemType="http://example.com/ItemType/XSD"
...
<xsl:output method="xml" indent="yes"/>
<xsl:namespace-alias stylesheet-prefix="it" result-prefix="ItemType"/>
<xsl:namespace-alias stylesheet-prefix="itemType" result-prefix="ItemType"/>