首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RelaxNG中的控件属性值顺序

RelaxNG中的控件属性值顺序
EN

Stack Overflow用户
提问于 2017-05-17 04:59:36
回答 1查看 298关注 0票数 0

是否可以控制Relax中属性值的顺序?哪一个可以使用模式中的xs:assert来实现?

XML:

代码语言:javascript
复制
<body>
 <h1 class="title">title</h1>
 <h2 class="subtitle">subtitle</h2>
 <p class="paragraph1">para text 1</p>
 <p class="paragraph2">Para text 2</p>
 <p class="paragraph3">Para text 2</p>
 </body>

类值应该是有序的,paragraph1应该始终放在第一位,paragraph2应该放在paragraph1之后。我在架构中尝试的断言:

代码语言:javascript
复制
<xs:assert test="p[1]/@class = 'paragraph1'
and ((every $i in p[2] satisfies $i/@class = 'paragraph2')
and (every $i in p[3] satisfies $i/@class = 'paragraph3'))  "/>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-17 05:22:14

用来表达问题描述的(紧凑语法) RelaxNG语法可以写成:

代码语言:javascript
复制
start = element body { h1?, h2?, p.paragraph1?, p.paragraph2?, p.paragraph3? }
h1 = element h1 { text & attribute class { string } }
h2 = element h2 { text & attribute class { string } }
p.paragraph1 = element p { text & attribute class { string "paragraph1" } }
p.paragraph2 = element p { text & attribute class { string "paragraph2" } }
p.paragraph3 = element p { text & attribute class { string "paragraph3" } }

用RelaxNG XML语法表示:

代码语言:javascript
复制
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="">
  <start>
    <element name="body">
      <optional>
        <ref name="h1"/>
      </optional>
      <optional>
        <ref name="h2"/>
      </optional>
      <optional>
        <ref name="p.paragraph1"/>
      </optional>
      <optional>
        <ref name="p.paragraph2"/>
      </optional>
      <optional>
        <ref name="p.paragraph3"/>
      </optional>
    </element>
  </start>
  <define name="h1">
    <element name="h1">
      <interleave>
        <text/>
        <attribute name="class">
          <data type="string"/>
        </attribute>
      </interleave>
    </element>
  </define>
  <define name="h2">
    <element name="h2">
      <interleave>
        <text/>
        <attribute name="class">
          <data type="string"/>
        </attribute>
      </interleave>
    </element>
  </define>
  <define name="p.paragraph1">
    <element name="p">
      <interleave>
        <text/>
        <attribute name="class">
          <value type="string">paragraph1</value>
        </attribute>
      </interleave>
    </element>
  </define>
  <define name="p.paragraph2">
    <element name="p">
      <interleave>
        <text/>
        <attribute name="class">
          <value type="string">paragraph2</value>
        </attribute>
      </interleave>
    </element>
  </define>
  <define name="p.paragraph3">
    <element name="p">
      <interleave>
        <text/>
        <attribute name="class">
          <value type="string">paragraph3</value>
        </attribute>
      </interleave>
    </element>
  </define>
</grammar>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44015970

复制
相关文章

相似问题

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