我目前正在研究一个嵌入了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>
但是使用此方法我会收到样式表编译错误。如果我删除了part:而不是(../@remark),它会正常工作,并像预期的那样在带有@remark的元素上产生错误,但是我似乎无法排除这一点,甚至是可能的。
通过帮助我来表示感谢!
答案 0 :(得分:0)
@context
的{{1}}必须引用一个节点。 rule
是一个节点,@handle
也是一个节点,但是@remark
是一个计算结果为true或false的表达式。它不是节点。
您可以将@handle and not(../@remark)
改写为:
rule/@context
...将在所有没有@handle[not(../@remark)]
兄弟属性的@handle
属性节点上触发。