2014-01-10 2 views
1

У меня есть документ XML, фрагмент строка из которых может выглядеть следующим образом:Выберите все брат и сестра (включая текст) комментарий в XPath

<p>Some text <!--a comment --> some more text <b>some bold text</b> something else etc</p> 

Я хотел бы, чтобы выбрать свой комментарий на основе его текста, но также все последующие «брачные» элементы. В этом примере я знаю, что могу получить комментарий с помощью «// comment() [. = "комментарий"] '.

Как я могу получить результат: «еще один текст полужирный текст что-то еще и т. Д.»? (остальная часть братьев и сестер внутри тега абзаца)

В случае, если это имеет значение, я использую python и etree для разбора.

EDIT:

Мой тест XML в полном объеме:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<p>A paragraph<!--A comment--><b>test</b>A line break</p> 
</root> 

Мой тест XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:template match="/"> 
     <xsl:copy-of select='//comment()/following-sibling::node()'/> 
    </xsl:template> 
</xsl:stylesheet> 

Результат:

<?xml version="1.0" encoding="UTF-8"?> 

или, в Python, используя lxml, просто объект «Нет».

EDIT # 2:

Мой плохо - принятый ответ хорошо работает!

ответ

1

Если вы хотите, чтобы все братья и сестры, включая другие комментарии:

//comment()[.="a comment "]/following-sibling::node() 

Например:

>>> xml.xpath('//comment()[.="a comment "]/following-sibling::node()') 
[' some more text ', <Element b at 0x2923af0>, ' ', <!-- other comment -->, ' something else etc'] 

я добавил дополнительный комментарий, но в противном случае используется ваши входные данные.

+0

Спасибо за ответ; Однако мне нужно выбрать только элементы/после/конкретного комментария. (Мне еще не удавалось использовать комментарий как предыдущий узел.) –

+0

А, я отредактировал ответ, чтобы ответить на этот вопрос. –

+0

Спасибо, хотя я немного сумасшедший, потому что это именно то, что я пытался. Отредактировано выше, чтобы продемонстрировать проблему. –

Смежные вопросы