如何让 xPath 表达式满足多个条件

How to have xPath expression for more than one conditions

(已更新)

我有类似下面的东西XML:

<?xml version="1.0" encoding="utf-8"?>
<ChangeTypes>
    <ChangeType Type="ItemGLStock">
        <ItemMessages>
            <ItemMessage Type="MessageType="TypeI">
                <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/>
            </ItemMessage>
            <ItemMessage Type="MessageType="TypeII">
                <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/>
            </ItemMessage>
            <ItemMessage Type="MessageType="TypeIII">
                <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/>
            </ItemMessage>
            <ItemMessage Type="MessageType="TypeIV">
                <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/>
            </ItemMessage>
        </ItemMessages>
    </ChangeType>
</ChangeTypes>

现在我想使用 XPath select 一个基于 ChangeType 和 ItemMessage Type 的 MessageContentTermID 和 MessageContent。 可能吗?

您的示例输入 XML 无效 - 我已经进行了调整,例如<ChangeType ="ItemGLStock"><ChangeType Type="ItemGLStock"><ItemMessage Type="MessageType="TypeI"><ItemMessage MessageType="TypeI"> 并将打开但关闭但反之亦然的 ItemGLEvaluationMessage 标签更改为 ItemMessage 以下内容调整后的示例输入:

<ChangeTypes>
  <ChangeType Type="ItemGLStock">
    <ItemGLEvaluationMessages>
        <ItemMessage MessageType="TypeI">
            <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/>
        </ItemMessage>
        <ItemMessage MessageType="TypeII">
            <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/>
        </ItemMessage>
        <ItemMessage MessageType="TypeIII">
            <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/>
     </ItemMessage>
        <ItemMessage MessageType="TypeIV">
            <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/>
        </ItemMessage>
    </ItemGLEvaluationMessages>
  </ChangeType>
</ChangeTypes>

对于这个例子,下面的 XPath

//Content[parent::ItemMessage[@MessageType="TypeI"] and
          ancestor::ChangeType[@Type='ItemGLStock']]
         /@MessageContentTermID

根据两个条件选择MessageContentTermID

parent::ItemMessage[@MessageType="TypeI"] 
and
ancestor::ChangeType[@Type='ItemGLStock']

结果:

MessageContentTermID="0"

对于MessageContent,相应的是:

//Content[parent::ItemMessage[@MessageType="TypeI"] and 
          ancestor::ChangeType[@Type='ItemGLStock']]
         /@MessageContent

结果:

MessageContent="Bla Bla Bla"

如果你只想要值,你可以使用 string():

string(//Content[parent::ItemMessage[@MessageType="TypeI"] and
                 ancestor::ChangeType[@Type='ItemGLStock']]
                /@MessageContent)

结果:

Bla Bla Bla