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;