【问题标题】:XPath to find nodes having 2 leaf childrenXPath 查找具有 2 个叶子子节点的节点
【发布时间】:2017-03-17 13:44:35
【问题描述】:

我有一个这样的 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 叶兄弟姐妹。

任何帮助将不胜感激。

【问题讨论】:

  • .//*[count(child::) = 2] ?
  • 这个没用。感谢您的尝试

标签: xml xpath


【解决方案1】:

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

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

如果两个子元素都是RTok,这将返回有两个子元素的RApp 元素

【讨论】:

  • 为什么不被接受?您需要改进解决方案吗?
  • 对不起,我对这种接受感到困惑。我只是认为使用 .//*[not(/) 和 count(*) = 2] 会更好,因为它适用于具有不同标签名称的任何 XML。是的,如果我不想要节点(RApp)但只想要它的孩子,我想要改进,就像这个一样?即没有任何其他兄弟姐妹的任何 2 叶兄弟姐妹。
  • 我的意思是我想要没有孩子的节点,它们只有 2 个兄弟姐妹。所以在我的例子中,我想要 ~p 没有他们的父母 的节点
  • 你能试试//*[count(child::*)=2 and count(descendant::*)=2]/*,让我知道它是否按预期工作吗?
  • 对不起,我以为我回复了你。是的,它可以按我的需要工作。谢谢
【解决方案2】:

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

  • 任何节点
  • 没有重子
  • 正好有 2 个孩子

似乎是您的“具有 2 个叶子孩子的节点”。

出于好奇,.//*[count(.//*[not(*)]) = 2] 将匹配“正好有 2 个作为叶子的后代 [children and sub-children] 的节点”

【讨论】:

  • 您的第一个 xpath 表达式非常好,它不使用标签名称,因此可以与任何 xml 文件一起使用。但是如果我不想要节点(RApp)而只想要它的子节点怎么办?即任何叶子2兄弟
  • 没有任何其他兄弟的任何叶子 2 兄弟
  • 在理解您的请求时遇到了一些麻烦(因此延迟了),但是如果您想选择优秀的孩子,只需添加/*/* 所以.//*[not(*/*) and count(*) = 2]/*/*(星号可以变成更窄的选择器,比如RAppRTok 取决于你想要匹配的内容)
猜你喜欢
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 2011-07-24
  • 2023-02-16
  • 2011-04-22
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
相关资源
最近更新 更多