11

簡単な質問: 文字列「通知」で終わる属性を持つすべての 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

私はそれらを別々に列挙するだけになりました。

4

3 に答える 3

6

私も同じ問題を抱えていました。multiple複数のノードの一致を許可するために XJC で使用される属性があることがわかりました。

また、バインディングをすべてのスキーマの場所に適用したいと考えました。xs:anyURIうまくいきませんでしたが、*トークンを使用してそれを行う方法を見つけました。required="false"一致を含まないスキーマを無視するために属性を追加しました。

<jxb:bindings schemaLocation="*">
  <jxb:bindings node="//xs:complexType[substring(name(), string-length(name()) - 12) = 'Notification']" multiple="true" required="false">
    <inheritance:implements>com.google.checkout.sdk.notifications.Notification</inheritance:implements> 
  </jxb:bindings>
</jxb:bindings>

編集:質問のコメントを読まずにこの回答を投稿しました。そのために残念。org.codehaus.mojo:jaxb2-maven-plugin:1.5XJCプラグインでmavenプラグインを使用していますorg.jvnet.jaxb2_commons:jaxb2-basics-project:0.6.4が、このように機能するようです...

于 2013-09-03T12:11:33.900 に答える
5

とともに

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

要素名が「通知」で終わるすべての要素を求める式。'Notification' で終わる name 属性を持つすべての要素を要求する必要があります。

代わりにこれを試してください:

//xs:complexType[substring(@name, string-length(@name)-string-length("Notification")+1)="Notification"]
于 2012-02-10T18:06:39.183 に答える