Вполне вероятно, что ваша проблема возникает из-за присутствия пространства имен по умолчанию (xhtml) в исходном XHTML-файле (который вы нам не показали, так что в лучшем случае это предположение).
Может ли кто-нибудь объяснить правильный способ удаления и всех его дочерних элементов из преобразования идентификации?
Вот как это сделать в случае наличия пространства имен по умолчанию :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xhtml:div[@class='foo']"/>
</xsl:stylesheet>
Когда это преобразование применено к следующему документу XHTML :
<html xmlns="http://www.w3.org/1999/xhtml">
<div class="class1">
<p>Text1</p>
</div>
<div class="foo">
<p>Text foo</p>
</div>
<div class="class2">
<p>Text2</p>
</div>
</html>
, будет получен нужный, правильный результат :
<html xmlns="http://www.w3.org/1999/xhtml">
<div class="class1">
<p>Text1</p>
</div>
<div class="class2">
<p>Text2</p>
</div>
</html>
Использование префикса пространства имен в выражении совпадения шаблона необходимо , поскольку XPath считает любое имя без префикса в "пространстве имен", а выражение совпадения с именами без префикса - нет.сопоставлять любые узлы, поскольку он указывает узлы в «no namspace», но все узлы исходного документа находятся в пространстве имен XHTML.
В случае, если в исходном документе нет пространства имен по умолчанию.Это преобразование может быть упрощено :
Когда это преобразование применяется к следующему документу XML (обратите внимание, что оно не определяет пространство имен по умолчанию):
<html>
<div class="class1">
<p>Text1</p>
</div>
<div class="foo">
<p>Text foo</p>
</div>
<div class="class2">
<p>Text2</p>
</div>
</html>
желаемый, правильный результат получается :
<html>
<div class="class1">
<p>Text1</p>
</div>
<div class="class2">
<p>Text2</p>
</div>
</html>
ОбаДля преобразования используйте правило идентификации , чтобы скопировать любой узел документа и другой шаблон, который переопределяет правило идентификации для узлов, соответствующих "div[@class='foo']"
.Этот второй шаблон пуст (не имеет тела), что означает, что соответствующий узел и корневое поддерево в нем не обрабатываются вообще (игнорируются) и, следовательно, не будут отображаться в выходных данных.