XSL, как получить следующий блок текста с помощью .NET XSLT - PullRequest
0 голосов
/ 23 декабря 2009

У меня есть документ, который в упрощенном виде выглядит так:

<?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 примерно так:

(// ДИВ [@ класс = "Текст"]) [0] / следующий-родственный :: узел (0)

Очевидно, что это мусор; то, что я ищу, это какое-то выражение, которое означает «выберите текст узла div, который имеет класс Text, где предыдущий узел div имеет класс заголовка, а текст предыдущего узла - Введение».

Я тоже думаю о LINQ to Xml.

Какое выражение XPath сделает это?

Ответы [ 2 ]

1 голос
/ 24 декабря 2009

Вот консольное приложение C #, чтобы получить именно то, что вы ищете. Обратите внимание, что я использовал xpath Weblog, но расширил его, чтобы получить точные данные, которые вы искали.

Вывод на консоль: 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);
            }
        }
    }
}
1 голос
/ 23 декабря 2009

Я думаю, что это может сделать это:

//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']
  ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...