Я пишу код, который реорганизует пространства имен в произвольный XML, потенциально изменяя их префиксы. Это было довольно просто, пока я не наткнулся на атрибут xsi: type:
<foo xsi:type="xs:string">...</foo>
Если я изменю префикс xs пространства имен XSD, я должен сделать то же самое для этого значения xsi: type, например, в
<foo i:type="x:string">...</foo>
Этот атрибут хорошо известен. Тем не менее, в общем, если я найду код, подобный этому:
<foo xmlns:aaa="http://bbb">
<bar name="aaa:123">...</bar>
</foo>
Есть ли способ сказать, что в значении "aaa: 123" часть "aaa" относится к пространству имен http://bbb"?
т.е. возможно, это просто имя "aaa: 123", без какой-либо предполагаемой ссылки на пространство имен с префиксом "aaa", и совпадение является случайным.
Если это поможет, язык реализации - Java.
Update / Решение
Благодаря полезным пояснениям и указателям, приведенным в ответах ниже, я изменил свой код для работы по следующим правилам, когда он встречает атрибут с префиксным значением:
- Для атрибута xsi: type обновите префикс значения атрибута, чтобы он соответствовал
новый префикс для http://www.w3.org/2001/XMLSchema.
- Если в текущем контексте НЕТ пространства имен с совпадающим префиксом,
значение считается буквальным (не QName) и оставляется как есть.
- Если в текущем
там есть пространство имен с соответствующим префиксом, мы не можем сказать,
если значение атрибута является литералом или QName, и поэтому код отменяет
обрабатывает и оставляет документ как есть. Документ не
изменены вообще.
Для всех, кто заинтересован, код здесь .
Я знаю, что логику можно улучшить, не касаясь только пространств имен, на которые влияют неоднозначные атрибуты, но для меня это достаточно хорошо (tm).