【发布时间】:2021-09-15 18:05:16
【问题描述】:
我知道通常使用/the/path/to/a/node/text() 来提取字符串值。这还不足以解决我的问题。
我正在使用 XML Schema 1.0 版来定义一些文档类型。我正在尝试为文档类型创建一个非常简单的 keywords 部分。所以我首先创建了一个非常简单的复杂类型。
<xs:complexType name="KeywordsList">
<xs:sequence>
<xs:element name="tag" type="xs:token" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
所以现在我有一个类型,它可以包含任意数量的包含xs:token 值的元素的列表。 我的问题始于如何禁止重复。
我经常使用xs:key 和xs:unique 来完成这个非常琐碎的任务,但我只对属性值或更深嵌套的元素使用过它。例如,如果关键字值存储在名为 value 的属性中,我知道我可以做这样的事情。
...
<xs:element name="keywords" type="KeywordsList">
<xs:unique name="KeywordsListUnique">
<xs:selector xpath="child::tag"/>
<xs:field xpath="@value"/>
</xs:unique>
</xs:element>
...
真正让我困惑的是<xs:selector xpath="child::tag"/> 足以让 XML 解析器找到值,但我必须至少包含一个 xs:field 标签。
起初我以为我应该指定 <xs:field xpath="text()"/> 来引用节点的文本内容,但是当我这样做时,我收到了来自 OxygenXML 的错误消息。
c-general-xpath:表达式“text()”对于 XML Schema 支持的 XPath 子集无效。
我收到child::text()、./text() 和其他一些类似消息的类似消息。通过使用单个点来引用当前节点,我已经摆脱了错误消息,但我不知道 . 是否是正确的表达式。
那么我应该在xs:field 标签中添加什么?
【问题讨论】:
标签: xml xpath xml-parsing xsd-1.0