如何在XPath中创建引用其他节点的嵌套条件

时间:2013-04-24 15:51:16

标签: xslt xpath

在嵌套条件下,如何引用“外部”括号对中的当前节点。假设我有以下xml:

<?xml version="1.0" encoding="utf-8"?>
<Root>
    <Gizmos>
        <Gizmo>
            <Id>1</Id>
        </Gizmo>
        <Gizmo>
            <Id>2</Id>
        </Gizmo>
        <Gizmo>
            <Id>3</Id>
        </Gizmo>
    </Gizmos>
    <Validations>
        <Validation>
            <Id>A</Id>
            <GizmoId>1</GizmoId>
        </Validation>
        <Validation>
            <Id>B</Id>
            <GizmoId>2</GizmoId>
        </Validation>
        <Validation>
            <Id>C</Id>
            <GizmoId>3</GizmoId>
        </Validation>
    </Validations>
    <Approvals>
        <ValidationId>B</ValidationId>
        <ValidationId>C</ValidationId>
    </Approvals>
</Root>

我想使用此代码过滤掉已批准小发明的节点集(即Gizmo 2和3):

/Root/Gizmos/Gizmo[/Root/Validations/Validation[GizmoId = ?.Id]/Id = /Root/Approvals/ValidationId]

这是否允许,如果是,我会用问号代替什么?

1 个答案:

答案 0 :(得分:3)

以下XPath返回Gizmo 2和3:

/Root/Gizmos/Gizmo[Id=/Root/Validations/Validation[Id=/Root/Approvals/ValidationId]/GizmoId]

为了打破这一点,内在表达

/Root/Validations/Validation[Id=/Root/Approvals/ValidationId]

返回Id viz 中包含Approval的所有验证,

<Validation>
  <Id>B</Id>
  <GizmoId>2</GizmoId>
</Validation> 

<Validation>
  <Id>C</Id>
  <GizmoId>3</GizmoId>
</Validation> 

您可以使用该表达式过滤完整的Gizmo列表,方法是将Id与子表达式中的GizmoId进行匹配。