XPATH 选择类型元素名称为 xs:simpleType 的子元素
Posted
技术标签:
【中文标题】XPATH 选择类型元素名称为 xs:simpleType 的子元素【英文标题】:XPATH Select child elements whose type's element name is xs:simpleType 【发布时间】:2012-07-19 03:23:15 【问题描述】:我正在尝试选择序列中实现类型的元素名称为 xs:simpleType 的所有子元素。
<xs:complexType name="Truck">
<xs:complexContent>
<xs:extension base="Car">
<xs:sequence>
<xs:element name="DriverName" type="Name">
...
</xs:element>
<xs:element name="Engine" type="TruckEngine">
...
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
类型“名称”的样子:
<xs:simpleType name="Name">
...
</xs:simpleType>
“TruckEngine”看起来像:
<xs:complexType name="TruckEngine">
...
</xs:complexType>
如何创建 XPATH 来选择元素 DriverName?到目前为止,我有类似 xs:complexType/xs:complexContent/xs:extension/xs:sequence/xs:element 的东西,但我不知道如何进一步改进我的选择。我很难搜索相关信息,因为我不确定使用什么术语来选择这样的东西。我已将示例修改为更通用的内容。
【问题讨论】:
【参考方案1】:除非您知道架构作者使用的约定,否则尝试从架构文档中提取信息是困难的(几乎不可能)。例如,来自 DevNull 的解决方案(您已接受)仅适用于在同一模式文档中定义的类型,它仅适用于命名(非匿名)类型,并且仅适用于没有 targetNamespace 的模式文档.
对于更通用的解决方案,它适用于任何架构而不管创作约定,不要尝试这样做:使用架构 API,让您在架构处理器分析后访问“熟”的架构组件.一种方法是使用 Xerces,它为模式组件提供 Java API,另一种方法是使用 Saxon 的 SCM 格式,它在单个文档中提供“熟”模式组件的 XML 表示。
【讨论】:
【参考方案2】:你可以使用:
//xs:element[@type = //xs:simpleType/@name]
虽然我建议使用更明确的路径而不是使用 //
。
(编辑:将eq
更改为=
)
【讨论】:
我还不能回答我自己的问题,但你把我们推向了正确的方向。我将其修改为:xs:element[contains(@type, //xs:simpleType/@name)] 我忘了说,之所以使用contains是因为 //xs:simpleType 是在捕获文档根目录下的所有simpleType,所以无法直接比较。包含在匹配元素列表中搜索,然后将它们的名称与我们元素的类型进行比较。 @kurtzbot - 你试过=
而不是eq
吗? (我对不止一个 xs:simpleType
进行了编辑)很高兴你让它工作了。
是的,我认为您指的是实际的 '=' 符号并首先尝试了它,但它不起作用。我不得不使用包含。
请看我对这个答案的批评。它只能在非常有限的情况下工作,尽管对于这个用例来说可能没问题。以上是关于XPATH 选择类型元素名称为 xs:simpleType 的子元素的主要内容,如果未能解决你的问题,请参考以下文章