1

我正在尝试使用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中的“是|有条件地”

4

1 回答 1

1

要访问某个节点的祖先,您可以使用如下表达式:

//xs:element[ancestor::*[@name="AddDisputeRequestType"]]

xs:element此表达式使用 xpath 祖先轴将选择所有(和任何)作为满足谓词关于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')]

什么会选择名称中包含“目标”子字符串的所有元素。

这个构造几乎可以用来检查文本内容和属性名称,我已经更新了一个小提琴,你可能想检查它的样本并进一步摆弄:h​​ttp: //xsltransform.net/gVAjbTj/2

当然,您可以自由地组合您需要执行任何特定任务的任何内容,例如“查找具有该名称的所有元素,这些元素具有名称的某些后代或具有名为whatever的属性的任何后代”。

希望这可以帮助 )

于 2019-08-16T07:57:43.507 回答