Xpath 1.0选择第一个节点回到祖先

时间:2019-03-06 09:37:18

标签: xpath

我的XML如下:

<Query>
  <Comp>
    <Pers>
        <Emp>
            <Job>
                <Code>Not selected</Code>
            </Job>
        </Emp>
        <Emp>
            <Job>
                <Code>selected</Code>
            </Job>
        </Emp>
    </Pers>
  </Comp>
</Query>

我有一个XPath:/ Query / Comp / Pers / Emp / Job [Code ='selected'] /../../../ ..

结果中只能有一个满足条件的

<Query>
  <Comp>
    <Pers>
        <Emp>
            <Job>
                <Code>selected</Code>
            </Job>
        </Emp>
    </Pers>
  </Comp>
</Query>        

如何获得结果? 该系统不适用于祖先::: *。我必须使用'/ ..'来填充祖先。

1 个答案:

答案 0 :(得分:0)

您不必在这里使用ancestor来获得<emp>标记,下面的expath应该选择任何符合您条件的<emp>标记:

/Query/Comp/Pers/Emp[Job[Code='selected']]

注意:您说您的结果应该为1,在这种情况下将是正确的,但是此表达式将返回与您的条件匹配的 all 个节点


编辑:

您已经说过您正在使用XSLT,并且在下面给了我一些摘要,但是我仍然不确定100%的实际结构。您可以使用XPath识别不等于selected的所有节点,然后使用XSLT复制除那些节点之外的所有节点。

// Copy's all nodes in the input to the output
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" />
  </xsl:copy>
</xsl:template>

// Matches specifically the Emp records that are not equal to selected and 
// applies no action to them to they do not appear in the output
<xsl:template match="/Query/Comp/Pers/Emp[Job[Code!='selected']]" />

以上两个模板会将您的输入转换为所需的输出!