XPath以查找具有2个叶子节点的节点

时间:2017-03-17 13:44:35

标签: xml xpath

我有这样的XML:

<?xml version="1.0" encoding="UTF-8"?>
<Math mode="inline" tex="\tilde{p}_{d}\leq\tilde{p}_{d+1}" text="(tilde@(p)) _ d less= (tilde@(p)) _ (d + 1)">
    <RMath>
        <RApp>
            <RTok meaning="less-than-or-equals" name="leq" role="RELOP">?</RTok>
            <RApp>
                <RTok role="SUBSCRIPTOP" scriptpos="post2"/>
                <RApp>
                    <RTok name="tilde" role="OVERACCENT" stretchy="false">~</RTok>
                    <RTok role="UNKNOWN" font="italic">p</RTok>
                </RApp>
                <RTok role="UNKNOWN" font="italic">d</RTok>
            </RApp>
            <RApp>
                <RTok role="SUBSCRIPTOP" scriptpos="post2"/>
                <RApp>
                    <RTok name="tilde" role="OVERACCENT" stretchy="false">~</RTok>
                    <RTok role="UNKNOWN" font="italic">p</RTok>
                </RApp>
                <RApp>
                    <RTok meaning="plus" role="ADDOP">+</RTok>
                    <RTok role="UNKNOWN" font="italic">d</RTok>
                    <RTok meaning="1" role="NUMBER">1</RTok>
                </RApp>
            </RApp>
        </RApp>
    </RMath>
</Math>

我想使用XPath来提取具有2个子节点的节点,其中2个子节点是叶节点,例如:

<RApp>
      <RTok name="tilde" role="OVERACCENT" stretchy="false">~</RTok>
      <RTok role="UNKNOWN" font="italic">p</RTok>
</RApp>

我无法想到这种提取的适当谓词。

我知道.//*[not(child::*)]找到所有叶子节点。

//*[not(child::*) and (ancestor-or-self::XMApp)]将找到所有具有祖先标记RApp的叶节点。

我不想要节点(RApp)但只想要它的孩子?即任何没有任何其他兄弟姐妹的2叶子兄弟。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下方法获得理想的输出:

//RApp[count(child::*)=2 and count(child::RTok)=2]

如果两个子元素都是RApp

,则会返回包含2个子元素的RTok个元素

答案 1 :(得分:0)

.//*[not(*/*) and count(*) = 2]我能想到的更具可读性:

  • 任何节点
  • 没有好孩子
  • 那只有2个孩子

似乎是你的“有2个孩子的节点”。

对于好奇心,.//*[count(.//*[not(*)]) = 2]将匹配“正好有2个后代[子女和子孩子]的节点”