我目前正在研究嵌入了schematron规则的简单模式。其中一条规则是检查名为@handle的特定元素的属性值,该元素应以12345开头。但是,如果同一元素具有另一个名为@remark的可选属性,则此规则不适用,因为该值将是随机的。
我有以下xml:
<record handle="12345/random numbers"/>
<record handle="abcdef" remark="value"/>
以下架构代码段:
<xs:element name="record">
<xs:annotation>
<xs:appinfo>
<sch:pattern id="handle check"
xmlns:sch="http://purl.oclc.org/dsdl/schematron">
<sch:rule context="@handle and not(../@remark)">
<sch:assert test="starts-with(.,'12345')">Handle-id, should start with 12345</sch:assert>
</sch:rule>
</sch:pattern>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="title" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="material" use="optional"/>
<xs:attribute name="remark" type="coll:remark" use="optional"/>
<xs:attribute name="handle" use="required">
</xs:attribute>
</xs:complexType>
</xs:element>
但使用这个我得到样式表编译错误。如果我删除了部分:而不是(../@ remark),它工作正常并在@remark的元素上创建错误,但我似乎无法排除这个,如果这是可能的话。
感谢先进,试图帮助我!
@context
的rule
必须指代一个节点。 @handle
是一个节点,@remark
也是一个节点,但@handle and not(../@remark)
是一个计算结果为true或false的表达式。它不是一个节点。
您可以将rule/@context
重写为:
@handle[not(../@remark)]
...将触发所有没有@handle
兄弟属性的@remark
属性节点。