2013-11-29 3 views
1

Можно ли проверить следующую XML, где имя ребенка родителя является его атрибут «имя»:XSD: Имя ребенка является имя атрибута родительского

<root> 
    <parent name="foo"> 
    <foo/> 
    </parent> 
    <parent name="bar"> 
    <bar/> 
    </parent> 
    <parent name="abc"> 
    <xyz/> <!-- invalid --> 
    </parent> 
</root> 

XSD, согласно запросу:

<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:complexType name="parentType"> 
    <xsd:sequence> 
     <!-- TODO: enforce element name same as it's parent's attribute "name" --> 
    </xsd:sequence> 
    <xsd:attribute name="name" type="xsd:string" use="required"/> 
    </xsd:complexType> 

    <xsd:element name="root"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="parent" type="parentType"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

«TODO» - это то место, где я в тупике. Заранее благодарю за любую помощь!

+0

Конечно, можно проверить любой XML, он может оказаться недействительным. Пожалуйста, добавьте * .xsd схему в свой пост, чтобы получить полезный ответ. –

ответ

1

В XSD 1.0 вы не можете указывать такое ограничение напрямую, но вы можете указать его с помощью Schematron или проверить его на уровне приложения.

В XSD 1.1, вы могли бы использовать xsd:assert:

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema elementFormDefault="qualified" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:complexType name="parentType"> 
    <xsd:sequence> 
     <xsd:any processContents="lax" minOccurs="1" maxOccurs="1"/> 
    </xsd:sequence> 
    <xsd:attribute name="name" type="xsd:string" use="required"/> 
    <xsd:assert test="@name = local-name(*[1])"/> 
    </xsd:complexType> 

    <xsd:element name="root"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="parent" type="parentType" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 
+0

спасибо за понимание. Знаете ли вы, возможно ли это с DTD или RELAX NG? – Jims

+0

Не знаете, как это сделать. Задавайте отдельные вопросы, если это имеет значение. – kjhughes

0

Это упражнение в том, что может пойти не так, когда вы нарушаете правила «Не повторяйте себе» в XML?

+0

@McQueer, к сожалению, я не могу контролировать структуру XML. Это происходит от третьего лица. Однако я не знаю об этом «правиле». Не могли бы вы поделиться ссылкой на него? – Jims

+0

@Jims: [** DRY **] (http://en.wikipedia.org/wiki/Don't_repeat_yourself) - это принцип проектирования за пределами XML. – kjhughes

Смежные вопросы