Один из самых простых решений на вопрос ФП является следующее выражение XPath:
*/*[.='bar']
ли к сведению, что ни одна инструкция XSLT не является - это просто выражение XPath, поэтому вопрос может быть отмечен только с помощью XPath.
Здесь вы можете использовать это выражение XPath в XSLT различными способами, например применять шаблоны для всех выбранных узлов.
Например, ниже является преобразование XSLT, который принимает документ XML и создает еще один, в котором все элементы - дети <AA>
содержание которых не равное "bar"
удаляются:
<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="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="AA">
<xsl:copy>
<xsl:apply-templates select="*[. = 'bar']"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Когда преобразование применяется на оригинальном XML-документе:
<AA>
<BB>foo</BB>
<CC>bar</CC>
<DD>baz</DD>
<EE>bar</EE>
</AA>
разыскиваемый результат получают :
<AA>
<CC>bar</CC>
<EE>bar</EE>
</AA>
Обратите внимание:
В шаблоне матча мы, как правило, не требуется указывать абсолютное выражение XPath, но только относительным, так что полное выражение XPath естественно упрощено до этого матча образец:
*[. = 'bar']
Спасибо! Другое ваше сообщение было полезно, так как следующее расширение использовало бы регулярные выражения для выбора: http://stackoverflow.com/questions/539781/xpath-search-based-on-dynamic-regular-expressions – krasnaya
@zhen Добро пожаловать. Имейте в виду, что решение RegEx находится в XPath 2.0 - в XPath 1.0 нет такого удобного способа сделать это –