Выбор узлов с XPath для привязки подмножества классов с JAXB

Упрощенный вопрос: Что такое XPath для выбора всех узлов XML с атрибутом, заканчивающимся строкой «Уведомление». Первый и третий узлы в этом фрагменте:

 <events>
   <event name="CreatedNotification" />
   <event name="InfoLog" />
   <event name="UpdatedNotification" />
 </events>

Подробный вопрос:

Я хочу выбрать несколько complexTypes из схемы xsd для связывания с JAXB. Это работает для одного класса: OrderStateChangeNotification

<jxb:bindings schemaLocation="apiv2.xsd">
  <jxb:bindings node="//xs:complexType[@name='OrderStateChangeNotification']">
    <inheritance:implements>com.google.checkout.sdk.notifications.Notification</inheritance:implements> 
  </jxb:bindings>
</jxb:bindings>

Вот соответствующий фрагмент из файла схемы схемы:

  <xs:complexType name="OrderStateChangeNotification">
    <xs:all>
      <xs:element name="new-fulfillment-order-state" type="tns:FulfillmentOrderState" />
      <xs:element name="new-financial-order-state" type="tns:FinancialOrderState" />
      <xs:element name="previous-fulfillment-order-state" type="tns:FulfillmentOrderState" />
      <xs:element name="previous-financial-order-state" type="tns:FinancialOrderState" />
      <xs:element name="reason" type="xs:string" minOccurs="0" />
      <xs:element name="timestamp" type="xs:dateTime" />
      <xs:element name="google-order-number" type="xs:token" />
      <xs:element name="order-summary" type="tns:OrderSummary" minOccurs="0" />
    </xs:all>
    <xs:attribute name="serial-number" type="xs:string" use="required" />
  </xs:complexType>

  <xs:complexType name="ChargeAmountNotification">
    <xs:all>
      <xs:element name="timestamp" type="xs:dateTime" />
      <xs:element name="latest-charge-amount" type="tns:Money" />
      <xs:element name="latest-charge-fee" type="tns:FeeStructure" minOccurs="0" />
      <xs:element name="total-charge-amount" type="tns:Money" />
      <xs:element name="latest-promotion-charge-amount" type="tns:Money" minOccurs="0" />
      <xs:element name="google-order-number" type="xs:token" />
      <xs:element name="order-summary" type="tns:OrderSummary" minOccurs="0" />
    </xs:all>
    <xs:attribute name="serial-number" type="xs:string" use="required" />
  </xs:complexType>

Я хочу, чтобы привязка применялась ко всем объектам уведомлений. Все они заканчиваются на «Уведомление»

. Я пытался изменить XPath с

//xs:complexType[@name='OrderStateChangeNotification']

на

//xs:complexType[substring(name(), string-length(name()) - 12) = 'Notification']

, но это не сработало.

Другой подход - попытаться выбрать все узлы с дочерними элементами «сводка заказа» и «серийный номер», поскольку я знаю, что они есть только у объектов уведомления.

ОБНОВЛЕНИЕ: Решение @Lee Greco правильно выбирает нужные мне узлы, но, к сожалению, плагин наследования несовместим с несколькими узлами:

[ERROR] XPath evaluation of "//xs:complexType[substring(@name, string-length(@name)-string-length('Notification')+1)='Notification']" results in too many (8) target nodes

Я просто перечислял их по отдельности.

10
задан matt burns 13 February 2012 в 22:16
поделиться