Ограничение совместной встречаемости атрибута/элемента в XML-схеме

Вы можете попробовать это:

# make some arrays
score = [100, 50, 43, 67, 89, 2, 13, 56, 22, -1, 53]
homework_problem = ['A', 'B', 'C', 'B', 'A', 'D', 'D', 'A', 'C', 'D', 'B']
topic = ['F', 'G', 'H', 'G', 'H', 'F', 'H', 'G', 'G', 'F', 'H']

# put the arrays into a pandas df
df = pd.DataFrame()
df['score'] = score
df['homework_problem'] = homework_problem
df['topic'] = topic

df['scoregroup'] = pd.cut(df['score'],bins=[0,50,75,100], labels=['Poor','Bad','Good'])

#make sure it looks okay
print(df)

# let's groupby and plot
d = df.groupby(['homework_problem','scoregroup'])['topic'].size().unstack()
d.plot(kind='bar',stacked=True, title = "Test")

Выход:

    score homework_problem topic scoregroup
0     100                A     F       Good
1      50                B     G       Poor
2      43                C     H       Poor
3      67                B     G        Bad
4      89                A     H       Good
5       2                D     F       Poor
6      13                D     H       Poor
7      56                A     G        Bad
8      22                C     G       Poor
9      -1                D     F        NaN
10     53                B     H        Bad

enter image description here

8
задан Maxim Vladimirsky 3 December 2008 в 08:24
поделиться

3 ответа

После поиска в Интернете и закапывания некоторых книг я выяснил, как реализовать это.

В первую очередь, мы должны определить универсальный тип, который размещает все атрибуты и элементы от обоих видов примитивного элемента. Предполагается, что элемент определения определяется где-то в другом месте.

<xs:complexType name="primitive" abstract="true">
    <xs:sequence>
        <xs:element ref="definition" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="name" type="xs:Name" />
    <xs:attribute name="ref" type="xs:Name" />
</xs:complexType>

Затем мы определяем два примитивных подтипа, которые будут использоваться в примитивном списке и составном объекте соответственно.

<xs:complexType name="public-primitive">
    <xs:complexContent>
        <xs:restriction base="primitive">
            <xs:sequence>
                <xs:element ref="definition" minOccurs="1" maxOccurs="unbounded" />
            </xs:sequence>
            <xs:attribute name="name" type="xs:Name" use="required" />
            <xs:attribute name="ref" use="prohibited" />
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="private-primitive">
    <xs:complexContent>
        <xs:restriction base="primitive">
            <xs:sequence>
                <xs:element ref="definition" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
            <xs:attribute name="name" use="prohibited" />
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

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

<xs:element name="primitive-list">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="primitive" type="public-primitive" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="composite">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="primitive" type="private-primitive" maxOccurs="unbounded">
                <xs:key name="definition-ref--co-occurrence--constraint">
                    <xs:selector xpath="." />
                    <xs:field xpath="definition|@ref" />
                </xs:key>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Давайте смотреть на исходные требования схемы и давайте посмотрим, как они осуществляются:

  • Если примитивный элемент указан в элементе примитивного списка, то он должен содержать атрибут имени и встроенный элемент определения, но не касательно атрибута.

Это требование осуществляется определением одного только общедоступного типа примитива.

  • Если примитивный элемент указан в составном элементе, то он должен содержать или касательно атрибута или элемента определения. Имя не позволяется ни в каком случаи.

Это требование осуществляется определением частного типа примитива и xs:key элементом, указанным в примитивном элементе, определенном в составном элементе. Гарантии xs:key, что или касательно или определение присутствует, но не оба.

9
ответ дан 5 December 2019 в 19:04
поделиться

Да, это возможно. При создании XML-схемы Вы будете создавать составной тип для каждого сценария, на основе того, где в дереве XML элемент определяется.

Если я добираюсь мгновение спустя на, я могу попытаться на самом деле получить пример здесь для Вас, у меня просто нет времени для получения всего этого отлично для регистрации здесь.

Я лично настоятельно рекомендую рассмотрение этого w3schools учебного руководства, поскольку это должно получить Вас, в чем Вы нуждаетесь.

0
ответ дан 5 December 2019 в 19:04
поделиться

Хорошо, вот образец, это получает Вас близко, единственной вещью, не обработанной, является примитив и касательно атрибута на составном объекте. Взгляд на то, что я могу найти, это, действительно почти кажется, невозможно сделать это с помощью схемы. Я не на 100% уверен, хотя, но во всех случаях, где я видел сделанный, схема как это используется для кода проверки и процесса высокого уровня, затем используется для проверки отдельных объектов.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://www.iowacomputergurus.com/stackoverflow/samples/xsdexample"
    elementFormDefault="qualified"
    xmlns="http://www.iowacomputergurus.com/stackoverflow/samples/xsdexample"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

  <xs:complexType name="PrimitiveType">
    <xs:sequence>
      <xs:element name="definition" type="xs:string" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
    <xs:attribute name ="name" use="required" type="xs:string" />
  </xs:complexType>

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
          <xs:element name="primitive-list" minOccurs="1" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="primitive" type="PrimitiveType" minOccurs="1" maxOccurs="unbounded" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="composite-list" minOccurs="1" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="composite">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="primitive" minOccurs="1" maxOccurs="unbounded">
                        <xs:complexType>
                          <xs:sequence>
                            <xs:element name="definition" minOccurs="0" maxOccurs="1" />
                          </xs:sequence>
                          <xs:attribute name="ref" use="optional" type="xs:string" />
                        </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:sequence>
    </xs:complexType>
  </xs:element>  
</xs:schema>
0
ответ дан 5 December 2019 в 19:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: