2014-03-25 178 views
2

的價值,我會用一個例子限制XML屬性不同屬性的/元素的值

<template> 
    <components> 
    <component name="switch" /> 
    <component name="server" /> 
    </components> 
    <layout> 
    <grid> 
     <position componentName="switch" positionX="0" positionY="0" /> 
    </grid> 
    </layout> 
</template> 

我要的是限制在componentName屬性值,以匹配上面components指定的名稱的一個開始。這在JAXB中可能嗎?因爲我需要註釋的類然後用於生成XSD。

回答

3

鑑於您的情況,XSD 1.0可以通過key/keyref組合強制執行「參照完整性」。然而,我不知道JAXB中這些結構有什麼註釋(聽起來好像你正在從你的Java類生成一個XSD);至少我從來沒有遇到過這樣的註釋(見列表here

<?xml version="1.0" encoding="utf-8"?> 
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)--> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="template"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="components"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element maxOccurs="unbounded" name="component"> 
       <xsd:complexType> 
        <xsd:attribute name="name" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="layout"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="grid"> 
       <xsd:complexType> 
        <xsd:sequence> 
        <xsd:element name="position"> 
         <xsd:complexType> 
         <xsd:attribute name="componentName" type="xsd:string" use="required" /> 
         <xsd:attribute name="positionX" type="xsd:unsignedByte" use="required" /> 
         <xsd:attribute name="positionY" type="xsd:unsignedByte" use="required" /> 
         </xsd:complexType> 
        </xsd:element> 
        </xsd:sequence> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    <xsd:key name="ComponentsKey"> 
     <xsd:selector xpath="components/component"/> 
     <xsd:field xpath="@name"/> 
    </xsd:key> 
    <xsd:keyref name="MatchComponent" refer="ComponentsKey"> 
     <xsd:selector xpath="layout/grid/position"/> 
     <xsd:field xpath="@componentName"/> 
    </xsd:keyref> 
    </xsd:element> 
</xsd:schema>