有没有一种方法可以创建规则来在存在另一个属性时检查属性的值?
Is there a way to create a rule to check the value of an attribute when another attribute is present?
我目前正在研究一个嵌入了 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>
但是使用这个我得到样式表编译错误。如果我删除 and not(../@remark)
部分,它会正常工作,并会像预期的那样在带有 @remark
的元素上产生错误,但我似乎无法排除这一点,我想知道这是否可能。
rule
的 @context
必须引用一个节点。 @handle
是一个节点,@remark
也是一个节点,但是 @handle and not(../@remark)
是一个计算结果为 true 或 false 的表达式。不是节点。
您可以将 rule/@context
重写为:
@handle[not(../@remark)]
... 这将触发所有 @handle
没有 @remark
兄弟属性的属性节点。
我目前正在研究一个嵌入了 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>
但是使用这个我得到样式表编译错误。如果我删除 and not(../@remark)
部分,它会正常工作,并会像预期的那样在带有 @remark
的元素上产生错误,但我似乎无法排除这一点,我想知道这是否可能。
rule
的 @context
必须引用一个节点。 @handle
是一个节点,@remark
也是一个节点,但是 @handle and not(../@remark)
是一个计算结果为 true 或 false 的表达式。不是节点。
您可以将 rule/@context
重写为:
@handle[not(../@remark)]
... 这将触发所有 @handle
没有 @remark
兄弟属性的属性节点。