2009-10-05 3 views
0

결과 추론 :XSLT - 다음 XML 입력을 감안할 때 어린이

<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> 

나는 아이들의 부모의 결과를 추론 할 :

<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> 

이 어떻게로 변환 할 수 있습니다. 자식 중 하나라도 Pass = "False"결과를 얻으면 부모 결과는 Pass = "False"가됩니다. 역방향 재귀?

+0

XSLT 그것은 XML에 더 잘 작동, 공백을 변환 매우 좋지 않다. :) –

+0

변형이 필요하지 않습니다. :) 당신이 XML과 원하는 출력을 포함하도록 편집해야한다고 생각합니다. –

+0

하하 ... 코드 블록을 추가하는 데 어려움을 겪고 마침내 지침을 읽으려고 결정했습니다. –

답변

0

당신은 그것을 할 수 :

  1. 은을 추가합니다 Pass 특성이없는 출력에 입력으로부터 모든 것을 복사 할 identity transform를 사용하여 요소 노드에 대한

  2. . 자식에 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

".//node()[ @Pass='True' ]"XPath 식을 사용하면 현재 노드의 자식이 "참"인지 확인할 수 있습니다. 다음과 같이