使用Xpath查询引用的XML元素
我正在使用BeSimpleSoapBundle在Symfony 2中生成一个web服务。 retrieveOrders方法的响应应该在工作流引擎中使用 Web服务的生成响应是:使用Xpath查询引用的XML元素,xml,xslt,symfony,soap,xpath,Xml,Xslt,Symfony,Soap,Xpath,我正在使用BeSimpleSoapBundle在Symfony 2中生成一个web服务。 retrieveOrders方法的响应应该在工作流引擎中使用 Web服务的生成响应是: <SOAP-ENV:Envelope xmlns:SOAP-ENV="..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:retrieveOrdersResponse> &
<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>
我的问题是:
- 为什么它不起作用李>
- 这些参考文献是否标准化
- 如果不能使用Xpath,是否有一种简单的方法可以使用XSLT解析该结构
- 有没有一种方法可以防止BeSimpleSoapBundle中出现这种默认行为
(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
它是有效的,尽管它并不完美。如果有一个专门的功能,简化了逻辑,请让我知道 像这样的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, '#')]
您可以做的另一件事是使用这个简单的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>
18
2013-12-17T07:00:00+00:00
12
2.
1.
测试
试试这个//bezeichung
不幸的是同样的效果非常感谢!这个很好用。在进行大量查询时,转换非常有用。@twiechert很高兴听到这一点。如果这解决了您的问题,如果您能单击复选标记图标将其标记为正确答案,我将不胜感激。:)
<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>