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 的子元素的主要内容,如果未能解决你的问题,请参考以下文章

xpath选择父节点类型不同的子节点

我们如何使用没有标签名称的 xpath 查找元素? [复制]

jsp:xpath - xml

XPath 表达式查找标签名称包含“名称”的元素

使用XPath选择DOM元素

使用XPath选择DOM元素