【问题标题】:Xsl how to get next block of text using .NET xsltXsl如何使用.NET xslt获取下一个文本块
【发布时间】:2009-12-23 13:33:55
【问题描述】:

我有一个文档,简化后看起来像这样:

<?xml version="1.0"?>
<document>
    <br/>
    <div class="Heading">Introduction</div>
    <div class="Text">Sed quis malesuada ligula. Aliquam eu felis nulla, ac tempus purus.</div>
    <br/>
    <div class="Heading">Background</div>
    <div class="Text">Curabitur adipiscing tortor ipsum. In gravida congue tincidunt. Aliquam</div>
    <br/>
    <div class="Heading">Summary</div>
    <div class="Text">Pellentesque consequat scelerisque urna, sit amet consequat quam lacinia ac.</div>
    <br/>
</document>

我想做的是获取介绍的文本:“Sed .... puris.”,所以我需要一个类似这样的 xpath 表达式:

(//div[@class="Text"])[0]/following-sibling::node(0)

显然这是垃圾;我正在寻找的是一些表达式,意思是“选择具有文本类的 div 节点的文本,其中前一个 div 节点具有一个标题类,前一个节点的文本是简介”。

我也在考虑 LINQ to Xml。

什么 XPath 表达式会这样做?

【问题讨论】:

    标签: xslt xpath


    【解决方案1】:

    我认为这可能会做到:

    //div
      [@class='Text']
      [preceding-sibling::div
        [@class='Heading'
         and text() = 'Introduction']
      ]
    

    在测试中为我工作。让我解释一下。评论以#开头。

    # Select all divs
    //div 
      # With class 'Text'
      [@class='Text']
      # Whose preceding div sibling
      [preceding-sibling::div
        # Has the class 'Heading'
        [@class='Heading'
        # Contains the text 'Introduction'
        and text() = 'Introduction']
      ]
    

    【讨论】:

    • 您使用什么工具来测试这个,并且是 xpath 2.0-ism 的前兄弟?我正在使用 Liquid XML Studio 和 C# .NET,但遇到了无效令牌错误。
    • @IanT8:我使用了 Visual Studio 2005(我相信在内部使用 System.Xml 进行解析),它使用 XPath 1.0。对我来说效果很好。
    • 我的语法错误啊。知道为什么此表达式选择所有“
      ”节点:"//div[@class='Text'][preceding-sibling::div[@class='Heading' and text() = 'Introduction']]" 但是,如果我将介绍 div 和它的文本移动到文档的末尾,它会做正确的事情。最后,我使用 Joseph 的“[1]/text()”加法来获得结果,而不管介绍发生在哪里。
    【解决方案2】:

    这是一个 C# 控制台应用程序,可以为您提供所需的内容。请注意,我利用了 Weblog 的 xpath,但对其进行了扩展以获取您正在寻找的精确数据。

    控制台的输出是: Sed quis malesuada ligula。 Aliquam eu felis nulla, ac tempus purus。

    namespace StackOverflow
    {
        class Program
        {
            static void Main(string[] args)
            {
                string xPathStatement =
                    "document/div[@class='Text']" +
                    "[preceding-sibling::div" +
                    "[@class='Heading' and text() = 'Introduction']][1]/text()";
    
                string xmldoc =
                    "<?xml version='1.0'?>" +
                    "<document>" +
                    "<br/>" +
                    "<div class='Heading'>Introduction</div>" +
                    "<div class='Text'>Sed quis malesuada ligula. Aliquam eu felis nulla, ac tempus purus.</div>" +
                    "<br/>" +
                    "<div class='Heading'>Background</div>" +
                    "<div class='Text'>Curabitur adipiscing tortor ipsum. In gravida congue tincidunt. Aliquam</div>" +
                    "<br/>" +
                    "<div class='Heading'>Summary</div>" +
                    "<div class='Text'>Pellentesque consequat scelerisque urna, sit amet consequat quam lacinia ac.</div>" +
                    "<br/>" +
                    "</document>";
    
                XPathDocument doc = new XPathDocument(new StringReader(xmldoc));
    
                XPathNavigator nav = doc.CreateNavigator();
    
                XPathNodeIterator iter = nav.Select(xPathStatement);
    
                if (iter.MoveNext())
                {
                    Console.WriteLine(iter.Current.OuterXml);
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 2011-11-30
      相关资源
      最近更新 更多