我希望我的XML实例文档由一个或多个<a/>元素组成,后跟相同数量的<b/>元素。以下是一些有效的实例:
<a/><b/>, <a/><a/><b/><b/>, <a/><a/><a/><b/><b/><b/>我想使用XML Schema1.0来实现它。
我尝试过这种方法:
<xs:group name="context-free-language">
<xs:sequence>
<xs:element name="a" fixed="a" />
<xs:group ref="context-free-language" minOccurs="0" />
<xs:element name="b" fixed="b" />
</xs:sequence>
</xs:group>不幸的是,循环组引用是不允许的。
对如何实现这一点有什么建议吗?
发布于 2014-01-02 20:35:07
XML Schema1.0只提供了对上下文无关语法的部分支持。遗憾的是,它不支持需要相同数量的a和b的语法。另一方面,它支持一些上下文无关的语法。我写了一篇文章解释了这一点:http://www.xfront.com/XML-Schema-1-0-and-Relax-NG-Partially-Support-Context-Free-Grammars.pdf
发布于 2013-03-07 00:31:58
您的需求是识别一种上下文无关的语言。对于模式语言中的内容模型,您无法做到这一点,因为模式语言要求内容模型是正则表达式,因此需要定义常规语言,而不是上下文无关语言。目前广泛使用的模式语言都不允许内容模型定义上下文无关的语言。
您可以选择(1)更改您的设计,以便更好地使用您可以使用的技术,而不是与之对抗;(2)使用即席过程(如InfantPro‘’Aravind‘建议的XSLT样式表),或(3)使用Schematron或XSD 1.1中的断言来强制执行约束。
发布于 2013-03-06 22:39:48
这在XSD 1.0中是不可能的。我认为1.1也是不可能的。
还有像Schematron这样的替代方法。或者可以使用XSLT转换和输出结果。这反过来可以被验证,以查看XML是否有效。
我将简要介绍一下这第二种方法:
示例输入XML:
<?xml version="1.0" encoding="utf-8"?>
<root>
<a/>
<a/>
<b/>
<b/>
</root>示例XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<validation>
<xsl:choose>
<!--Output 'true' if count is equal .. and 'false' otherwise-->
<xsl:when test="count(a)=count(b)">
<xsl:text>true</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>false</xsl:text>
</xsl:otherwise>
</xsl:choose>
</validation>
</xsl:template>
</xsl:stylesheet> 由于count(a)等于count(b),因此输出如下:
<?xml version="1.0" encoding="utf-8"?>
<validation>true</validation>而这反过来将根据以下情况进行验证:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="validation" type="xs:boolean" fixed="true"/>
</xs:schema>在这种情况下,由于<validation>节点具有值true,因此将传递
注意: XSLT只创建了一个转换后的副本,我将其用于扩展验证,它不会修改原始输入。
https://stackoverflow.com/questions/15247251
复制相似问题