当存在另一个属性时,是否可以创建一种规则来检查属性的值

时间:2019-03-28 12:51:21

标签: xml xsd schema schematron

我目前正在研究一个嵌入了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的元素上产生错误,但是我似乎无法排除这一点,甚至是可能的。

通过帮助我来表示感谢!

1 个答案:

答案 0 :(得分:0)

@context的{​​{1}}必须引用一个节点。 rule是一个节点,@handle也是一个节点,但是@remark是一个计算结果为true或false的表达式。它不是节点。

您可以将@handle and not(../@remark)改写为:

rule/@context

...将在所有没有@handle[not(../@remark)]兄弟属性的@handle属性节点上触发。