Атрибут XML с префиксом в * value * - как определить, что это префикс пространства имен? - PullRequest
0 голосов
/ 08 мая 2018

Я пишу код, который реорганизует пространства имен в произвольный 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).

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Схема скажет вам, если атрибут введен как xs:QName, но не скажет, что это чувствительное к пространству имен выражение XPath (например, xsl:value-of/@select в XSLT или xs:selector/@xpath в XSD). И даже если бы вы знали, что эти атрибуты чувствительны к пространству имен, у вас было бы много подробного анализа для извлечения и замены префиксов пространства имен.

Так что даже со схемой задача в общем случае невозможна.

К сожалению, вы не первый, кто столкнулся с этой проблемой. Определение модели данных, используемой XPath, всегда преследовалось проблемой QNames-in-content (или, в более общем смысле, префиксов в содержимом).

0 голосов
/ 08 мая 2018

В общем случае это невозможно без знания интерпретации XML приложением. Однако существует слабое соглашение о том, что если рассматриваемый атрибут или элемент имеет тип данных схемы XML xsd:QName (таким образом, рассматриваемый XML должен быть описан схемой XML в первую очередь), то значение атрибута или элемента подлежит нормализации пространства имен.

См. Также Использование квалифицированных имен (QNames) в качестве идентификаторов в содержимом XML .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...