Вот одно выражение XPath один вкладыш, который выбирает разыскиваемых узлы:
//*[not(node()[not(self::text())])
and not(normalize-space)
and contains('|br|hr|link|meta|title|', concat('|', name(), '|'))
]
Это выбирает любой элемент в документе XML, который имеет только текстовый дочерний узел (если вообще) и чьи нормализованные (все начальные и конечные символы йота-пространство удалены и все взаимосвязаны опознавание смежных символов пробела, замененных одним пробелом), строковое значение - это пустая строка, имя которой является одним из br
, hr
, meta
или title
.
XSLT - на основе проверки:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"//*[not(node()[not(self::text())])
and not(normalize-space)
and contains('|br|hr|link|meta|title|', concat('|', name(), '|'))
]
"/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется на следующий документ XML:
<html lang='en'>
<head>
<meta charset='utf-8'/>
<title></title>
<link rel='stylesheet' href='/assets/index.css'/>
</head>
<body>
<div>
<header>
<h1></h1>
</header>
<section>
<article></article>
<aside></aside>
</section>
<br />
<footer>
<small>
Copyright ©
<span></span>
</small>
</footer>
</div>
<script src='//code.jquery.com/jquery-latest.min.js'></script>
<script src='/assets/index.js'></script>
</body>
</html>
выражение XPath вычисляется и (правильно), выбранного узлы копируются на выход:
<meta charset="utf-8"/>
<title/>
<link rel="stylesheet" href="/assets/index.css"/>
<br/>
спасибо, что работает: D – Alex
Кстати, ваш список пустых элементов модели контента в HTML является неполным. Я также не уверен, что произойдет, если вы используете 'loadHTML' для' DOMDocument', но у вас могут быть лучшие результаты. –