2009-04-05 3 views
13

XML сниппета:Выберите дочерние узлы на основе их содержимого

<AA> 
    <BB>foo</BB> 
    <CC>bar</CC> 
    <DD>baz</DD> 
    <EE>bar</EE> 
</AA> 

Как выбрать все дочерние узлы <AA>, которые имеют bar как его содержание? В приведенном выше примере я хотел бы выбрать <CC> и <EE>. Я имею в виду решение что-то вроде:

<xsl:template match="AA"> 
    <xsl:for-each select="???" /> 
</xsl:template> 

ответ

27

Один из самых простых решений на вопрос ФП является следующее выражение 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'] 
+1

Спасибо! Другое ваше сообщение было полезно, так как следующее расширение использовало бы регулярные выражения для выбора: http://stackoverflow.com/questions/539781/xpath-search-based-on-dynamic-regular-expressions – krasnaya

+0

@zhen Добро пожаловать. Имейте в виду, что решение RegEx находится в XPath 2.0 - в XPath 1.0 нет такого удобного способа сделать это –

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