2012-03-08 6 views
1

Предположим, что у меня это есть этот XML-документ, в котором ... просто представляет другие разные узлы:Match все узлы, которые содержат дочерний узел с конкретным содержанием

<AA> 
    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 

    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 

    <BB> 
     <CC>False</CC> 
     ... 
    </BB> 

    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 


    <BB> 
     <CC>False</CC> 
     ... 
    </BB> 
</AA> 

Я пытаюсь сделать некоторые шаблоны, например:

<xsl:template match="/"> 

<DD> 
    <xsl:apply-templates select="/AA/YYY" /> 
</DD> 

<EE> 
    <xsl:apply-templates select="/AA/XXX" /> 
</EE> 

</xsl:template> 

<xsl:template match="YYY"> 
<!-- do stuff --> 
</xsl:template> 

<xsl:template match="XXX"> 
    <!-- do stuff --> 
</xsl:template> 

для получения вывод, подобный этому:

<AA> 
    <DD> 
     <BB> 
      <CC>True</CC> 
     </BB> 
     <BB> 
      <CC>True</CC> 
      ... 
     </BB> 

     <BB> 
      <CC>True</CC> 
      ... 
     </BB> 
    </DD> 

    <EE> 
     <BB> 
      <CC>False</CC> 
      ... 
     </BB> 

     <BB> 
      <CC>False</CC> 
      ... 
     </BB> 
    </EE> 
</AA> 

Я просто изо всех сил, чтобы найти XPath s для размещения в атрибутах соответствия, где в настоящее время я размещаю XXX и YYY. Кто-нибудь получил ответ?

В основном я хочу выбрать все узлы, у которых есть дочерний узел, который содержит определенное содержимое.

ответ

1

Если вы используете преобразование идентичности, вам не нужны никакие дополнительные шаблоны, если вы не собираетесь что-либо менять в элементах <BB>.

XML Input

<AA> 
    <BB> 
    <CC>True</CC> 
    ... 
    </BB> 

    <BB> 
    <CC>True</CC> 
    ... 
    </BB> 

    <BB> 
    <CC>False</CC> 
    ... 
    </BB> 

    <BB> 
    <CC>True</CC> 
    ... 
    </BB> 


    <BB> 
    <CC>False</CC> 
    ... 
    </BB> 
</AA> 

XSLT 1,0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <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="@*"/> 
     <DD> 
     <xsl:apply-templates select="BB[CC='True']"/> 
     </DD> 
     <EE> 
     <xsl:apply-templates select="BB[CC='False']"/> 
     </EE> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML Output

<AA> 
    <DD> 
    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 
    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 
    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 
    </DD> 
    <EE> 
    <BB> 
     <CC>False</CC> 
     ... 
    </BB> 
    <BB> 
     <CC>False</CC> 
     ... 
    </BB> 
    </EE> 
</AA> 

Если вам нужно change <BB> добавить дополнительный шаблон (ы), чтобы переопределить преобразование идентичности.

+0

Спасибо. Синтаксис 'BB [CC = 'True']' был тем, что я искал. Мне нужно было сделать больше, чем предлагал оригинальный вопрос, именно эта штука сильно меня повесила. Спасибо за четкий ответ и хороший пример ввода/вывода. – user17753

+0

@ user1169578 - Тебе очень рады. +1 за хороший вопрос. –

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