XQuery: странный атрибут xsi, вставляемый в мой вывод XQuery

Вот пример вывода XQuery, который я получаю:

<clinic>
    <Name xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Healthy Kids Pediatrics</Name>
    <Address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">510 W 27th St, Los Angeles, CA 90007</Address>
    <PhoneNumberList>213-555-5845</PhoneNumberList>
    <NumberOfPatientGroups>2</NumberOfPatientGroups>
</clinic>

Как вы можете видеть, в <Name> а также <Address> есть следующие странные теги xmlns:xsi.

Самое смешное, если я зайду в начало моего xml-файла и удалю:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="vaccination.xsl"?>
<Vaccination xsi:noNamespaceSchemaLocation="vaccination.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

фраза

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

Тогда теперь мой вывод XQuery XML будет выглядеть так (что я и хочу)

<clinic>
    <Name>Healthy Kids Pediatrics</Name>
    <Address>510 W 27th St, Los Angeles, CA 90007</Address>
    <PhoneNumberList>213-555-5845</PhoneNumberList>
    <NumberOfPatientGroups>2</NumberOfPatientGroups>
</clinic>

НО, когда я просматриваю свой XML в своем браузере, он выдаст ошибку и отобразит что-то вроде:

XML Parsing Error: prefix not bound to a namespace
Location: file:///C:/Users/Pac/Desktop/csci585-hw3/vaccination.xml
Line Number 3, Column 1:<Vaccination xsi:noNamespaceSchemaLocation="vaccination.xsd">
^

У кого-нибудь есть идеи, как удалить эти теги xsi из моего вывода XQuery, не нарушая мой XML/XSL?

1 ответ

Решение

Удаление объявления пространства имен с верхнего узла делает документ XML недействительным, так как префикс xsi используется, но не объявляется. Это должно было вызвать ошибку при попытке загрузить документ в запросе.

Я предполагаю, что узлы Name и Address копируются непосредственно из исходного документа, а остальные узлы создаются.

При копировании узла из исходного документа пространства имен в области из исходного узла объединяются с пространствами имен в области в узле, который содержит копию. То, как они комбинируются, определяется режимом copy-namespaces-mode.

В вашем случае вы хотите, чтобы пространства имен были унаследованы от родительского узла (узла в запросе), но вы не хотите сохранять пространства имен в исходном документе, где они не нужны.

Это может быть достигнуто путем добавления следующей строки в начало запроса:

declare copy-namespaces no-preserve, inherit;
Другие вопросы по тегам