XPath - 返回子节点但不返回子节点

时间:2012-06-22 11:52:24

标签: c# xslt 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。

1 个答案:

答案 0 :(得分:4)

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()