XSLT:返回特定子节点的值,如果它存在于其中一个父节点中。在祖先树

时间:2018-05-20 05:13:44

标签: xslt xslt-1.0

我有一个类似于下面结构的XML。

<root>
    <randomElement>..</randomElement>
    <EFFECT>..</EFFECT>
    <parent2>
        <randomElement>..</randomElement>
        <EFFECT>..</EFFECT>
        <parent>
            <randomElement>..</randomElement>
            <EFFECT>..</EFFECT>
            <randomElement>..</randomElement>
            <ITEM>..</ITEM>
        </parent>
    </parent2>
</root>
  

注意:这些地方可以有任意数量的<randomElement>   在哪里指定。

所以,现在,我的指针位于<ITEM>标记处。我需要返回<EFFECT>标记内的值,但是,这里是捕捉。

如果它存在,我必须返回<EFFECT>标记内的<parent>标记的值。如果它不存在,我必须返回<EFFECT>标记内<parent2>标记的值。同样,如果它也不存在,我需要最终返回<EFFECT><root>标记的值。 <EFFECT>内的<root>将始终存在,<ITEM>元素可以包含任意数量的父级。

很抱歉,如果它令人困惑。

1 个答案:

答案 0 :(得分:0)

要转到任何<ITEM>,这就足够了。

//ITEM

现在,<EFFECT><ITEM>的兄弟,即它在同一级别上。另一种思考兄弟姐妹的方式是他们是同一父母的孩子。

事实上,所有<EFFECT>个元素都是<ITEM>祖先的子元素。这意味着我们可以沿着ancestor::轴向上移动并一步抓住所有这些祖先元素:

//ITEM/ancestor::*

这将按此顺序为我们<parent><parent2><root>

那些我们只需要向下一步即可获取所有<EFFECT>元素:

//ITEM/ancestor::*/EFFECT

这将为我们提供三个EFFECT元素,这次再次按文档顺序排列(只有ancestor::类型的轴在内部工作)。

我们对最后一个感兴趣,因为这将最接近我们开始的<ITEM>last()函数将在此处提供帮助:

(//ITEM/ancestor::*/EFFECT)[last()]

路径周围的括号是必要的,因为否则条件([last()])会在每个<EFFECT>上单独测试,并且每个条件都是其父类的最后一个,给出我们三场比赛。括号使得首先构造一个包含三个<EFFECT>元素的节点集,然后然后最后一个元素被构造,只给我们一个匹配。

如果您当前位于<ITEM>元素,则路径的相对版本会选择该特定项目的最后一个效果:

(ancestor::*/EFFECT)[last()]