我正在尝试使用eBaysvc.xsd不仅验证 xml 还构建 xml 本身:因此,作为 $API 传递添加争议我想检索这样的 xml:<?xml version="1.0" encoding="utf-8"?><AddDisputeRequest xmlns="urn:ebay:apis:eBLBaseComponents"> <DisputeExplanation> Tokens </DisputeExplanation> <DisputeReason> Tokens </DisputeReason> <ItemID> string </ItemID> <TransactionID> string </TransactionID> <OrderLineItemID> string </OrderLineItemID> <Version> string </Version> <RequesterCredentials> <eBayAuthToken> string </eBayAuthToken> </RequesterCredentials> <WarningLevel> Tokens </WarningLevel></AddDisputeRequest>我使用 xpath->query 构建了一个脚本,该脚本应该根据多个参数过滤元素,到目前为止我得到了这个:$Nodes = $xpath->query('//xs:element[(xs:annotation/xs:appinfo/ebl:CallInfo/ebl:CallName/text()="'.$API.'" or xs:annotation/xs:appinfo/ebl:CallInfo/ebl:AllCalls) and (xs:annotation/xs:appinfo/ebl:CallInfo/ebl:RequiredInput/text()="Yes" or xs:annotation/xs:appinfo/ebl:CallInfo/ebl:RequiredInput/text()="Conditionally")]')但我需要添加一个进一步的参数,它与元素无关,而是与他的祖先有关:假设元素与name="ItemID"我们需要添加到查询类似and element:parent:parent:parent:parent[@name="'.$API.'Type"]因为我们有这个定义:<xs:complexType name="AddDisputeRequestType"> <xs:annotation> <xs:documentation> Enables a buyer and seller in an order relationship to send messages to each other's My Messages Inboxes. </xs:documentation> <xs:appinfo> <RelatedCalls> AddMemberMessagesAAQToBidder, AddMemberMessageRTQ </RelatedCalls> </xs:appinfo> </xs:annotation> <xs:complexContent> <xs:extension base="ns:AbstractRequestType"> <xs:sequence> <xs:element name="ItemID" type="ns:ItemIDType" minOccurs="0"> ... </xs:element> </xs:sequence> </xs:extension> </xs:complexContent></xs:complexType>但不知道如何实现这一点:有人可以提出解决方案吗PS:有没有更简单的方法来检查RequiredInput中的“Yes|Conditionally”
1 回答
FFIVE
TA贡献1797条经验 获得超6个赞
要访问某个节点的祖先,您可以使用如下表达式:
//xs:element[ancestor::*[@name="AddDisputeRequestType"]]
此表达式使用 xpath 祖先轴将选择xs:element
满足关于name
属性的谓词的所有(和任何)元素。您可能想用一些更具体的元素名称替换星号。
axes
可以在这里找到一些关于东西的东西https://developer.mozilla.org/en-US/docs/Web/XPath/Axes和这里https://www.w3.org/TR/xpath-10/#axes
请注意,如果多个元素与表达式匹配,则可能需要额外小心。这是一个关于http://xsltransform.net/gVAjbTj的简短示例
更新:
是否有类似或包含操作数
我认为您可能会使用 xpath 函数contains
,例如:
//*[contains(name(), 'target')]
什么会选择名称中包含“目标”子字符串的所有元素。
这个构造几乎可以用来检查文本内容和属性名称,我已经更新了一个小提琴,你可能想检查它的样本并进一步摆弄:http : //xsltransform.net/gVAjbTj/2。
当然,您可以自由组合执行任何特定任务所需的任何内容,例如“查找具有该名称的所有元素,这些元素具有一些具有该名称的后代或具有名为what的属性的任何后代”。
希望这可以帮助 )
- 1 回答
- 0 关注
- 190 浏览
添加回答
举报
0/150
提交
取消