XPath - 返回子节点,但不返回后代



我有以下XML。

<Programme>
    <Intakes>
        <One>
            <Information />
        </One>
        <Two>
            <Information />
        </Two>
    </Intakes>
</Programme>

列表框中所需的结果信息:

One
Two

基本上,我希望填充一个列表框,其中包含每个摄入量的选项(一个,两个等)。

没有多次出现。

所以我没有得到单独的进气子节点?

当前代码:

        XPathNavigator nav;
        XPathDocument docNav;
        XPathNodeIterator NodeIter;
        string strExpression;
        docNav = new XPathDocument(docPath);
        nav = docNav.CreateNavigator();
        strExpression = "//Intakes/node()";
        NodeIter = nav.Select(strExpression);
        while (NodeIter.MoveNext())
        {
            lstIntakes.Items.Add(NodeIter.Current.Value);
        }

但是,这只会将一个项添加到包含节点内部所有 xml 的列表框中。

XPath 是一种用于 XML 文档的查询语言,因此它不能更改文档的结构

XSLT 是将 XML 文档转换为另一个文档的适当工具。此问题的 XSLT 解决方案是:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>
 <xsl:template match="/*"><xsl:apply-templates/></xsl:template>
 <xsl:template match="One/node()|Two/node()"/>
</xsl:stylesheet>

在提供的 XML 文档上应用此转换时:

<Programme>
    <Intakes>
        <One>
            <Information />
        </One>
        <Two>
            <Information />
        </Two>
    </Intakes>
</Programme>

生成所需的正确结果:

<Intakes>
   <One/>
   <Two/>
</Intakes>

更新:OP从根本上改变了这个问题 - 现在想要的结果是:

One  
Two 
单个 XPath

1.0 表达式仍然无法提供此功能(并且由于使用的是 C#,因此您可能无法访问 XPath 2.0 实现)。

您首先要选择Intakes的所有子元素:

/*/Intakes/*

然后,您必须循环访问返回的节点集,并针对其中包含的每个元素计算此 XPath 表达式

name()

最新更新