Symfony 2 で Web サービスを生成するために BeSimpleSoapBundle を使用しています。retrieveOrders メソッドの応答は、ワークフロー エンジン内で使用されることになっています。
Web サービスの生成された応答は次のとおりです。
<SOAP-ENV:Envelope xmlns:SOAP-ENV="..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:retrieveOrdersResponse>
<return>
<item>
<id>1</id>
<lieferdatum>2013-07-03T10:53:38+00:00</lieferdatum>
<tatsaechlichesLieferdatum xsi:nil="true" />
<bestellpositionen />
</item>
<item id="ref1">
<id>10</id>
<lieferdatum>2013-07-03T10:53:38+00:00</lieferdatum>
<tatsaechlichesLieferdatum xsi:nil="true" />
<bestellpositionen>
<item>
<id>6</id>
<liefermenge>3</liefermenge>
<bestellung href="#ref1" />
<produkt id="ref3">
<id>1</id>
<bezeichnung>test</bezeichnung>
</produkt>
<abweichungen />
</item>
</bestellpositionen>
</item>
<item id="ref2">
<id>11</id>
<lieferdatum>2013-07-03T10:53:38+00:00</lieferdatum>
<tatsaechlichesLieferdatum xsi:nil="true" />
<bestellpositionen>
<item>
<id>7</id>
<liefermenge>3</liefermenge>
<bestellung href="#ref2" />
<produkt href="#ref3" />
<abweichungen />
</item>
</bestellpositionen>
</item>
<item id="ref4">
<id>12</id>
<lieferdatum>2013-07-03T10:53:38+00:00</lieferdatum>
<tatsaechlichesLieferdatum xsi:nil="true" />
<bestellpositionen>
<item>
<id>8</id>
<liefermenge>3</liefermenge>
<bestellung href="#ref4" />
<produkt href="#ref3" />
<abweichungen />
</item>
</bestellpositionen>
</item>
<item id="ref5">
<id>13</id>
<lieferdatum>2013-07-03T10:53:38+00:00</lieferdatum>
<tatsaechlichesLieferdatum xsi:nil="true" />
<bestellpositionen>
<item>
<id>9</id>
<liefermenge>3</liefermenge>
<bestellung href="#ref5" />
<produkt href="#ref3" />
<abweichungen />
</item>
</bestellpositionen>
</item>
<item id="ref6">
<id>14</id>
<lieferdatum>2013-07-03T10:53:38+00:00</lieferdatum>
<tatsaechlichesLieferdatum xsi:nil="true" />
<bestellpositionen>
<item>
<id>10</id>
<liefermenge>3</liefermenge>
<bestellung href="#ref6" />
<produkt href="#ref3" />
<abweichungen />
</item>
</bestellpositionen>
</item>
<item>
<id>15</id>
<lieferdatum>2013-12-07T07:00:00+00:00</lieferdatum>
<tatsaechlichesLieferdatum xsi:nil="true" />
<bestellpositionen />
</item>
<item>
<id>16</id>
<lieferdatum>2013-12-07T07:00:00+00:00</lieferdatum>
<tatsaechlichesLieferdatum xsi:nil="true" />
<bestellpositionen />
</item>
<item id="ref7">
<id>17</id>
<lieferdatum>2013-12-07T07:00:00+00:00</lieferdatum>
<tatsaechlichesLieferdatum xsi:nil="true" />
<bestellpositionen>
<item>
<id>11</id>
<liefermenge>2</liefermenge>
<bestellung href="#ref7" />
<produkt href="#ref3" />
<abweichungen />
</item>
</bestellpositionen>
</item>
<item id="ref8">
<id>18</id>
<lieferdatum>2013-12-17T07:00:00+00:00</lieferdatum>
<tatsaechlichesLieferdatum xsi:nil="true" />
<bestellpositionen>
<item>
<id>12</id>
<liefermenge>2</liefermenge>
<bestellung href="#ref8" />
<produkt href="#ref3" />
<abweichungen />
</item>
</bestellpositionen>
</item>
</return>
</ns1:retrieveOrdersResponse>
ご覧のとおり、BeSimpleSoapBundle は以前に出力された XML 要素へのリンクを生成しています。
製品 #ref3 を再度定義する代わりに、 によって参照され<produkt href="#ref3" />
ます。
しかし、Xpath 経由で参照要素のプロパティ/ノードにアクセスするにはどうすればよいでしょうか? 具体的には、最初の製品名 (「bezeichnung」) を取得するにはどうすればよいですか?
次の Xpath クエリが機能していません。
/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:retrieveOrdersResponse/return/item[id=18]/bestellpositionen/item[id=12]/produkt/bezeichnung
私の質問は次のとおりです。
- なぜ機能しないのですか?
- これらの参照は標準化されていますか?
- Xpath で動作しない場合、XSLT で構造を解決する簡単な方法はありますか?
- BeSimpleSoapBundle でこのデフォルトの動作を防ぐ方法はありますか?
前もって感謝します!
アップデート
私の友人は、次のような構造を解決できる If-then-else 構文があると教えてくれました。
(if(orders/item[id=18]/bestellpositionen/item[id=12]/produkt/@href)
then(orders/item/bestellpositionen/item/produkt[@id= fn:substring(/orders/item[id=18] /bestellpositionen/item[id=12]/produkt/@href, 2) ])
else (orders/item[id=18]/bestellpositionen/item[id=12]/produkt))/bezeichnung
完璧ではありませんが、機能します。そのロジックを簡単にする専用の関数があれば教えてください!