Avatar billede rasmuslh Nybegynder
21. november 2005 - 10:48 Der er 3 kommentarer og
1 løsning

Reference til "abstrakt" gruppe

Hejsa

Jeg sidder og arbejder på et schema der skal bruges ifm. et workflowmanagement system, men jeg er løbet ind i et problem.

Jeg har et element der hedder <token> der kan være af 13 forskellige typer. Jeg vil derfor gerne lave en reference til de forskellige subpatterns:

<xs:element name="token">
    <xs:complexType mixed="true">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="xpnml:tokenplace1"/>
        <xs:element ref="xpnml:tokenplace2"/>
        <xs:element ref="xpnml:tokenplace3"/>
        <xs:element ref="xpnml:tokenplace4"/>
        <xs:element ref="xpnml:tokenplace5"/>
        <xs:element ref="xpnml:tokenplace6"/>
        <xs:element ref="xpnml:tokenplace7"/>
        <xs:element ref="xpnml:tokenplace8"/>
        <xs:element ref="xpnml:tokenplace9"/>
        <xs:element ref="xpnml:tokenplace10"/>
        <xs:element ref="xpnml:tokenplace11"/>
        <xs:element ref="xpnml:tokenplace12"/>
        <xs:element ref="xpnml:tokenplace13"/>
    </xs:choice>
    <xs:attribute ref="xpnml:id" use="required"/>
    </xs:complexType>
</xs:element>

<xs:element name="tokenplace1">
    <xs:complexType>
        <xs:sequence>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="adress" type="xs:string"/>                <xs:element ref="xpnml:cpr"/>
        <xs:element name="tlf" type="xs:integer"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Problemet er at elementet tokenplace1 ikke "findes" med blot er en slags fællesbenævnelse for token der er af typen token id="1". Hvordan får jeg schemaet til at forstå at tokensplace1 ikke er et element, men en gruppebetegnelse.

Her er et eksempel på fra mit XML:

<place id="p1" name="start">
    <tokens>
    <token id="1">
      <name>Rasmus</name>
      <adress>Testvej</adress>
      <cpr>270675-1111</cpr>
      <tlf>99999999</tlf>
    </token>
      </tokens>
</place>
<place id="p2" name="Nogetandet">
    <tokens>
    <token id="2">
      <ribers/>
    </token>
    </tokens>
</place>
<place id="p3" name="Nogettredje">
    <tokens>
    <token id="3">
      <regno/>
      <accountno/>
      <accountType/>
    </token>
    </tokens>
</place>

Når jeg prøver at validere imod mit schema får jeg at vide "Unexpected element 'name' in element 'token'

Hvis jeg bare sætter
<xs:element name="name" type="xs:string"/>
ind blandt de mulige tokenplaces får jeg ikke nogen fejl, men det er jo ikke det jeg ønsker.

Håber der er hjælp derude.

Rasmus
Avatar billede rasmuslh Nybegynder
21. november 2005 - 11:17 #1
Kan man alternativt lave en form for if-construct inde i choice:

<xs:element name="token">
    <xs:complexType mixed="true">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:if pattern="../place[@id='p1']">
          <xs:sequence>
              <xs:element name="name" type="xs:string"/>
              <xs:element name="adress" type="xs:string"/>
              <xs:element ref="xpnml:cpr"/>
              <xs:element name="tlf" type="xs:integer"/>
          </xs:sequence>
        </xs:if>
      ....
      </xs:choice>
    <xs:attribute ref="xpnml:id" use="required"/>
    </xs:complexType>
</xs:element>
Avatar billede Slettet bruger
21. november 2005 - 11:42 #2
Kan du ikke bruge <group> elementet til det?
Avatar billede rasmuslh Nybegynder
21. november 2005 - 12:02 #3
Det synes ikke umiddelbart at virke. Så brokker den siog over at det inde i group også skal være group elementer.

Nu har jeg i stedet prøvet at mixe elementerne ind i, men jeg mangler fortsat en måde at lave en slags conditions på sequence så de kun vælges hvis place id er det rigtige:

<xs:element name="token">
  <xs:complexType mixed="true">
    <xs:choice>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
          <xs:element name="adress" type="xs:string"/>
      <xs:element ref="xpnml:cpr"/>
      <xs:element name="tlf" type="xs:integer"/>
        </xs:sequence>
    <xs:sequence>
      <xs:element name="ribers" type="xs:boolean"/>
    </xs:sequence>
    <xs:sequence>
      <xs:element name="regno" type="xs:integer"/>
      <xs:element name="regno" type="xs:integer"/>
      <xs:element name="accountype" type="xs:string"/>
    </xs:sequence>
    ...
    </xs:choice>
    <xs:attribute ref="xpnml:id" use="required"/>
  </xs:complexType>
</xs:element>
Avatar billede rasmuslh Nybegynder
14. juli 2006 - 11:57 #4
Luk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester