У меня есть файл XML, содержащий кучу поисковых запросов. Упрощенная версия ниже:
<?xml version="1.0" encoding="UTF-8"?>
<Parties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="/usr/local/share/xml/schema/quantile/Parties.xsd">
<Party name="Bens Birthday">
<ZIP>AB1234</ZIP>
<EMAIL>[email protected]</EMAIL>
<ATTENDEES>
<ATTENDEE>Bob</ATTENDEE>
<ATTENDEE>David</ATTENDEE>
</ATTENDEES>
</Party>
</Parties>
Я написал простой XSD для проверки этих данных:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Parties">
<xs:complexType>
<xs:sequence>
<xs:element name="Party" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="ZIP" minOccurs="0" maxOccurs="1" type="xs:string"/>
<xs:element name="EMAIL" minOccurs="0" maxOccurs="1" type="xs:string"/>
<xs:element name="ATTENDEES" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="ATTENDEE" minOccurs="1" maxOccurs="unbounded" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Это хорошо работает.
Я загружаю файл XML в XSLT и использую его для поиска в преобразовании.
<xsl:variable name="party-details" select="document($party-file)/Parties"/>
<xsl:variable name="party-map" select="$party-details/Party[@name='Bens Birthday']"/>
Это хорошо работает, когда я опрашиваю текстовый узел:
<FOO>{$party-map/EMAIL}</FOO>
Но если я попытаюсь сделать то же самое с последовательностью:
<xsl:sequence select="$party-map/ATTENDEES/ATTENDEE"/>
Я наследую определение пространства имен из XML-файла Party:
<Parties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="/usr/local/share/xml/schema/quantile/Parties.xsd">
В результате получается такой вывод:
<ATTENDEE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Bob</ATTENDEE>
Очевидно, что если я удалю xmlns:xsi
и xsi:noNamespaceSchemaLocation
из XML-файла Party, проблема исчезнет... но тогда я не проверяю ее.
В конечном итоге это нарушает мою проверку вывода XSLT, поскольку определение xsi
не разрешено для элемента ATTENDEE
.
Я как бы понимаю, что здесь происходит — все дочерние элементы Parties
наследуют пространство имен xmlns:xsi, поэтому, когда я вставляю последовательность ATTENDEE
в вывод XSLT, отсутствие определения xsi
в XSLT означает, что процессор добавляет его. Я полагаю, сделайте это для текстовых узлов, потому что у них нет концепции пространства имен, это несет только элемент.
Я могу перенести проблему, определив xmlns:xsi в другом месте выходного элемента и родителя ATTENDEE
в XSLT.
Это все еще накладывает ограничения на мой выходной формат. Кажется, я должен быть в состоянии удалить пространство имен, но я не знаю, как действовать дальше.
Любые идеи? Или, если кто-то может категорически сказать, что это невозможно, какие-либо другие предложения - например, использовать вместо этого DTD или полностью исключить схему из XML и, возможно, выполнить проверку внутри XSLT? Я сейчас угадаю!