是否可以使用xpath / regex从schema 1.1属性中提取子字符串?如果是这样,怎么样?

时间:2014-05-27 17:21:03

标签: xml regex xpath xsd schema

我一直在寻找可以从xsd属性中提取子串的小时(schema / xpath newbie)。我基本上希望做的是keyref表示属性子串,如下所示:

<param name="public_images" type="boolean" value_source="account_settings.public_images"/>

在这里,我希望通过“。”分割来提取“account_settings”和“public_images”。字符,通过任何可能的方式,@ value_ource的值,然后将每个“标记”从(“account_settings”,“public_images”)键入模式中的其他属性/元素(我知道该怎么做,所以这部分不需要解释)。

同样,我希望在下面的{SOME_VALUE}模式中使用代码中的键属性/元素引用以下'SOME_VALUE'值:

<value>Client-ID {client_id}</value>
<access_header name="Authorization" value="Client-ID {client_id}"/>

有没有办法通过使用模式/选择器/字段架构工具,xpath / regex或其他方法来实现这一目的?请注意,这应该都在具有http://www.w3.org/2001/XMLSchema命名空间的模式1.1文件的内容中。

请帮助,这是一个非常时间敏感的问题,任何建议/帮助将不胜感激。

真诚地感谢, 彼得。

1 个答案:

答案 0 :(得分:2)

您所描述的内容超出了XSD 1.0或1.1键/ keyref约束的功能:它们可以检查文档中作为keyref出现的给定值是否也作为键出现在文档中,但函数类似于substring-before和substring-after在XSD身份约束中不可用。

如果将value_source属性拆分为两个属性,则使用标识约束解决问题时没有特别的问题。但是,考虑到你所拥有的XML结构,如果你在XSD 1.1中,唯一可行的选择就是使用断言来强加你想到的约束。

[添加]您没有说文档保存value_source属性值的各个部分必须对应的键值,因此完整的工作示例必然是一些虚构的工作。但是,让我们假设param元素可以出现在文档中的任何位置,并且@source_value属性的各个点分隔部分必须与source元素上的@id值匹配,该元素作为{的子元素出现{1}},它又作为value_sources的子项出现,它本身就是根元素的子元素。

在根元素上使用的复杂类型的声明中,您将添加类似以下形式的断言:

other-stuff

要记住的关键点是XSD 1.1断言只能向下指向其类型包含断言的元素。所以你不能把断言放在<xs:assert test=" every $param in .//param satisfies (every $sourceref in tokenize($param/@value_source,'\.') satisfies (some $sourcedecl in ./other-stuff/value_sources/source satisfies ($sourcedecl/@id = $sourceref))) " /> 元素上。您必须将其放在一些元素上,该元素保证包含param元素以及param约束匹配的值或元素或属性。如果你正如你所说的那样,你知道如何为value_source不必标记化的情况编写关键约束,那么在这里找出如何指向相关值应该没有问题。

但请注意,XSD 1.1实现不需要在断言中支持所有XPath 2.0;它们只允许支持较小的XPath子集。然而,Saxon和Xerces似乎都毫无困难地处理了上面提出的断言。