0

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

完璧ではありませんが、機能します。そのロジックを簡単にする専用の関数があれば教えてください!

4

1 に答える 1

1

次のような XPath が機能するはずです。

orders/item[id = 18]/bestellpositionen/item[id = 12]/produkt/bezeichnung | 
orders/item/bestellpositionen/item/produkt[id = 
   substring-after(../../../../item[id = 18]/bestellpositionen/item[id = 12]
                              /produkt/@href, '#')]

他にできることの 1 つは、この単純な XSLT を使用してすべての参照を解決することです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

  <xsl:key name="kRefTarget" match="*[@id]" use="@id"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- The [not(substring-after(@href, '#') = ancestor::*/@id)] portion prevents 
       infinite recursion on <bestellung> and anything else that references its
       own ancestor. -->
  <xsl:template match="*[@href]
                        [not(substring-after(@href, '#') = ancestor::*/@id)]">
    <xsl:apply-templates select="key('kRefTarget', substring-after(@href, '#'))" />
  </xsl:template>
</xsl:stylesheet>

サンプル入力でこれを実行すると、項目 18 の XML は次のようになります。

<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 id="ref3">
        <id>1</id>
        <bezeichnung>test</bezeichnung>
      </produkt>
      <abweichungen />
    </item>
  </bestellpositionen>
</item>
于 2013-07-07T15:53:54.380 に答える