Вы должны думать о XHTML как о иерархии элементов и рассматривать его как таковой. Это в основном способ обработки XML. Затем просто рекурсивно пройдитесь по иерархии, добавляя количество слов по ходу дела. Когда вы достигнете своего предела, отбросьте все остальное.
Я работаю в основном на PHP, и я бы использовал класс DOMDocument в PHP, чтобы помочь мне в этом, вам нужно найти что-то подобное на выбранном вами языке.
Чтобы прояснить ситуацию, вот иерархия для вашего образца:
- p
- Proin tristique dapibus neque. Nam eget purus sit amet leo
tincidunt accumsan.
- p
- Proin semper, orci at mattis blandit, augue justo blandit nulla.
- span
- Quisque ante congue justo
- , ultrices aliquet, mattis eget, hendrerit,
- em
- justo
- .
Вы достигли предела в 25 слов внутри элемента span, поэтому вы удаляете весь оставшийся текст внутри span и добавляете многоточие. Все остальные дочерние элементы (как текст, так и теги) могут быть отброшены, а все последующие элементы могут быть отброшены.
Насколько я понимаю, это всегда должно давать вам правильную разметку, потому что вы рассматриваете ее как иерархию, а не просто текст, все необходимые закрывающие теги все равно будут там.
Конечно, если XHTML, с которым вы имеете дело, недопустим для начала, не ожидайте, что вывод будет действительным.
Извините за плохой пример иерархии, не могу понять, как вложить списки.