首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建允许一个或多个<a/>后跟相等数量的<b/>的XML模式?

如何创建允许一个或多个<a/>后跟相等数量的<b/>的XML模式?
EN

Stack Overflow用户
提问于 2013-03-06 20:22:29
回答 4查看 197关注 0票数 1

我希望我的XML实例文档由一个或多个<a/>元素组成,后跟相同数量的<b/>元素。以下是一些有效的实例:

代码语言:javascript
复制
<a/><b/>, <a/><a/><b/><b/>, <a/><a/><a/><b/><b/><b/>

我想使用XML Schema1.0来实现它。

我尝试过这种方法:

代码语言:javascript
复制
<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>

不幸的是,循环组引用是不允许的。

对如何实现这一点有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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

票数 -1
EN

Stack Overflow用户

发布于 2013-03-07 00:31:58

您的需求是识别一种上下文无关的语言。对于模式语言中的内容模型,您无法做到这一点,因为模式语言要求内容模型是正则表达式,因此需要定义常规语言,而不是上下文无关语言。目前广泛使用的模式语言都不允许内容模型定义上下文无关的语言。

您可以选择(1)更改您的设计,以便更好地使用您可以使用的技术,而不是与之对抗;(2)使用即席过程(如InfantPro‘’Aravind‘建议的XSLT样式表),或(3)使用Schematron或XSD 1.1中的断言来强制执行约束。

票数 2
EN

Stack Overflow用户

发布于 2013-03-06 22:39:48

这在XSD 1.0中是不可能的。我认为1.1也是不可能的。

还有像Schematron这样的替代方法。或者可以使用XSLT转换和输出结果。这反过来可以被验证,以查看XML是否有效。

我将简要介绍一下这第二种方法:

示例输入XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<root>
  <a/>
  <a/>
  <b/>
  <b/>
</root>

示例XSLT:

代码语言:javascript
复制
<?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),因此输出如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<validation>true</validation>

而这反过来将根据以下情况进行验证:

代码语言:javascript
复制
<?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只创建了一个转换后的副本,我将其用于扩展验证,它不会修改原始输入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15247251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档