Я разрабатываю XML-поток продуктов, который будет использоваться рядом интернет-магазинов для публикации своих данных о продуктах. Структура этого фида товаров будет основана на стандарте Atom XML, аналогичном фид продуктов Google Atom. Я опубликую XSD-файл, который можно использовать для проверки товарных фидов.
По сути, каждый элемент <entry>
будет представлять продукт. Мне нужно будет добавить несколько дочерних элементов к элементу <entry>
, который будет содержать такие данные, как цена продукта, стоимость доставки и т. Д.
Проблема заключается в создании файла XSD. Я не уверен, как расширить стандарт Atom таким образом, чтобы можно было добавлять дочерние элементы в <entry>
. В настоящее время я просто определяю дополнительные элементы как элементы верхнего уровня, но это не позволяет мне указывать индикаторы возникновения (minOccurs
и maxOccurs
).
Я хочу указать количество элементов, которые требуются в каждом элементе <entry>
. Это могут быть новые элементы, введенные моей схемой (например, элемент <price>
, содержащий цену продукта), а также существующие элементы Atom (например, элемент <link>
, который определяется Atom, но не является обязательным).
Вот (упрощенная версия) моего текущего product-feed.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.com/schemas/product-feed"
xmlns:p="http://example.com/schemas/product-feed"
xmlns:atom="http://www.w3.org/2005/Atom"
elementFormDefault="qualified">
<xs:element name="brand" type="xs:string" />
<xs:element name="price" type="p:money" />
<xs:element name="shipping" type="p:money" />
<xs:complexType name="money">
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="currency"
type="p:currency"
use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="currency">
<xs:restriction base="xs:string">
<xs:enumeration value="EUR" />
<xs:enumeration value="USD" />
<xs:enumeration value="GBP" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
Вот пример xml-фида:
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
xmlns:p="http://example.com/schemas/product-feed"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<title>Example Store</title>
<link href="http://www.example-store.com/" rel="self" />
<updated>2014-08-08T10:44:20Z</updated>
<entry>
<title>Foo</title>
<link href="http://www.example-store.com/products/foo.html" />
<p:price currency="EUR">32.95</p:price>
<p:shipping currency="EUR">6.75</p:shipping>
</entry>
<entry>
<title>Bar</title>
<link href="http://www.example-store.com/products/acme-bar.html" />
<p:brand>Acme</p:brand>
<p:price currency="EUR">12.50</p:price>
<p:shipping currency="EUR">6.75</p:shipping>
</entry>
</feed>
Как я могу расширить схему Atom таким образом, чтобы мои пользовательские элементы были разрешены только внутри элемента <entry>
, и чтобы я мог определить, сколько раз они могут встречаться?
Единственное альтернативное решение, которое я могу придумать, - это дублировать файл определения схемы Atom (например, this one) и изменить это (добавить свои собственные элементы и изменить элементы Atom, которые мне нужны). Это не очень хорошо (я бы больше не расширял Atom, я просто создавал бы совершенно новую схему), поэтому я надеюсь на лучшее решение.
<entry>
таким образом, который предполагает, что вы не хотели бы, чтобы они были действительными за пределами<entry>
, отменяя правило схемы Atom, которое они действительны в другом месте. Какие еще дополнительные ограничения по отношению к схеме Atom вы хотите применить? Какие еще требования существуют для схемы, которую вы хотите написать? - person C. M. Sperberg-McQueen   schedule 12.08.2014