2009-10-05 2 views
0

Учитывая следующий ввод XML:XSLT - вывести результат от детей

<Sections> 
<Section number="1">  
    <Step number="1"> 
    <SubStep number="1" Pass="True">    
    <SubSubStep number="1" Pass="True"/>      
    <SubSubStep number="2" Pass="True"/>      
    </SubStep> 
    </Step> 
    <Step number="2"> 
    <SubStep number="1" Pass="False">     
    <SubSubStep number="1" Pass="True"/>      
    <SubSubStep number="2" Pass="False"/>     
    </SubStep> 
    </Step> 
</Section> 
</Sections> 

Как я могу преобразовать его в:

<Sections Pass="False"> 
<Section number="1" Pass="False">  
    <Step number="1" Pass="True"> 
    <SubStep number="1" Pass="True">    
    <SubSubStep number="1" Pass="True"/>      
    <SubSubStep number="2" Pass="True"/>      
    </SubStep> 
    </Step> 
    <Step number="2" Pass="False"> 
    <SubStep number="1" Pass="False">     
    <SubSubStep number="1" Pass="True"/>      
    <SubSubStep number="2" Pass="False"/>     
    </SubStep> 
    </Step> 
</Section> 
</Sections> 

Я хочу, чтобы вывести результат родителя с детьми. Если какой-либо из детей имеет результат Pass = «False», родительский результат будет Pass = «False». Обратная рекурсия?

+0

XSLT не очень хорошо преобразуя пропуски, он лучше работает на XML. :) –

+0

Преобразование не требуется. :) Я думаю, вам нужно отредактировать это, чтобы включить ваш XML и желаемый результат. –

+0

haha ​​... после попытки попытаться добавить блок кода, я, наконец, сдался и решил прочитать рекомендации :) –

ответ

0

Вы можете сделать это следующим образом:

  1. Используйте identity transform скопировать все от входа к выходу, и

  2. для узлов элементов без атрибута Pass, добавьте его. Установите его на False, если есть хотя бы один атрибут Pass со значением False у детей и до True в противном случае.


<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes"/> 

    <!-- identity transform --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- set missing Pass attribute --> 
    <xsl:template match="*[not(@Pass)]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:attribute name="Pass"> 
     <xsl:choose> 
      <xsl:when test=".//*[@Pass = 'False']">False</xsl:when> 
      <xsl:otherwise>True</xsl:otherwise> 
     </xsl:choose> 
     </xsl:attribute> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

спасибо. это именно то, что я искал –

0

Вы можете использовать выражение XPath «.//node()[ @Pass='True' ]», чтобы узнать, являются ли какие-либо дочерние элементы текущего узла «истинными».

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