有没有一种方法可以创建规则来在存在另一个属性时检查属性的值?

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 兄弟属性的属性节点。