簡単な質問: 文字列「通知」で終わる属性を持つすべての XML ノードを選択するための XPath は何ですか。このスニペットの最初と 3 番目のノード:
<events>
<event name="CreatedNotification" />
<event name="InfoLog" />
<event name="UpdatedNotification" />
</events>
詳細な質問:
JAXB とバインドするために、xsd スキーマから複数の complexTypes を選択したいと考えています。これは単一のクラスで機能します: 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
私はそれらを別々に列挙するだけになりました。