我正在编写一个仪表板设计器,它将根据xml值创建小部件。
喜欢
<dashboard>
<widget type="chart">
</widget>
</dashboard>
我想根据 @type 的值更改&lt; widget&gt; 中的代码,例如 type =“chart”然后它应该允许不同的标签
<dashboard>
<widget type="chart">
<title text="Chart Title"></title>
<plotOptions>
<plotOptions>
<pie showInLegend="true" shadow="false" innerSize="50%">
<dataLabels color="#fff" distance="-20" format="{point.percentage:.0f} %" overflow="false"></dataLabels>
</pie>
</plotOptions>
<legend width="150" align="right" x="10" layout="vertical">
<navigation></navigation>
</legend>
<tooltip enabled="false"></tooltip>
<exporting enabled="true"></exporting>
</plotOptions>
</widget>
</dashboard>
如果我们有 type =“table”它应该允许不同的标签
<dashboard>
<widget type="table">
<title text="Table Title"></title>
<thead>
<tr>
<th>One</th>
<th>Two</th>
<th>Three</th>
</tr>
</thead>
<tbody>
<tr>
<td>DS.One</td>
<td>DS.Two</td>
<td>DS.Three</td>
</tr>
</tbody>
</widget>
</dashboard>
它还应该在XML编辑器中提供自动建议,例如“ECLIPSE”
答案 0 :(得分:3)
其他解决方案是使用XML Schema 1.1中的类型替代。 使用替代类型,您可以根据属性的值为元素设置不同的类型。在您的情况下,如果@type的值是“chart”,则可以将widget元素设置为“chart”类型,如果@type的值是“table”,则可以设置为“table”类型。 请参阅下面的示例模式:
<xs:element name="dashboard">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="widget" type="widgetBaseType">
<xs:alternative test="@type='chart'" type="chart"/>
<xs:alternative test="@type='table'" type="table"/>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="widgetBaseType">
<xs:attribute name="type"/>
</xs:complexType>
<xs:complexType name="chart">
<xs:complexContent>
<xs:extension base="widgetBaseType">
<xs:sequence>
<xs:element name="title"/>
<xs:element name="plotOptions"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="table">
<xs:complexContent>
<xs:extension base="widgetBaseType">
<xs:sequence>
<xs:element name="title"/>
<xs:element name="thead"/>
<xs:element name="tbody"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
答案 1 :(得分:0)
如果您在内容中符合条件,则可以根据其名称空间验证内容:
<dashboard>
<widget type="chart">
<title text="Chart Title"></title>
<plotOptions xmlns="http://jaspersoft.com/highcharts"> ... </plotOptions>
</widget>
</dashboard>
如果可以将HTML表格元素包装在<table>
中,那么编写断言会更简单:
<dashboard>
<widget type="table">
<title text="Table Title"></title>
<table xmlns="http://www.w3.org/1999/xhtml">
<thead>...</thead>
<tbody>...</tbody>
</table>
</widget>
</dashboard>
使用xs:choice
,您可以选择由命名空间限定的不同xs:any
元素之一。在<assert>
中,您可以将内容的命名空间和标记名称与type
属性的内容进行比较:
<xs:element name="widget">
<xs:complexType>
<xs:sequence>
<xs:element name="title">...</xs:element>
<xs:choice>
<xs:any namespace="http://www.w3.org/1999/xhtml" processContents="lax" maxOccurs="unbounded" minOccurs="0"/>
<xs:any namespace="http://jaspersoft.com/highcharts" processContents="lax" maxOccurs="unbounded" minOccurs="0"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
<xs:assert test="(@type = 'table' and *[local-name() = 'table'
and namespace-uri() = 'http://www.w3.org/1999/xhtml'])
or (@type = 'chart' and *[local-name() = 'plotOptions'
and namespace-uri() = 'http://jaspersoft.com/highcharts'])"/>
</xs:complexType>
</xs:element>