有没有办法创建规则来检查属性的值,当存在 另一个属性时

问题描述 投票:0回答:1

我目前正在研究嵌入了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的元素上创建错误,但我似乎无法排除这个,如果这是可能的话。

感谢先进,试图帮助我!

xml xsd schema schematron
1个回答
0
投票

@contextrule必须指代一个节点。 @handle是一个节点,@remark也是一个节点,但@handle and not(../@remark)是一个计算结果为true或false的表达式。它不是一个节点。

您可以将rule/@context重写为:

@handle[not(../@remark)]

...将触发所有没有@handle兄弟属性的@remark属性节点。

© www.soinside.com 2019 - 2024. All rights reserved.