【问题标题】:XPATH Select child elements whose type's element name is xs:simpleTypeXPATH 选择类型元素名称为 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 的东西,但我不知道如何进一步改进我的选择。我很难搜索相关信息,因为我不确定使用什么术语来选择这样的东西。我已将示例修改为更通用的内容。

【问题讨论】:

    标签: xslt xpath


    【解决方案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 进行了编辑)很高兴你让它工作了。
      • 是的,我认为您指的是实际的 '=' 符号并首先尝试了它,但它不起作用。我不得不使用包含。
      • 请看我对这个答案的批评。它只能在非常有限的情况下工作,尽管对于这个用例来说可能没问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2021-02-23
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      相关资源
      最近更新 更多