xslt - 推断儿童的结果

时间:2009-10-05 16:12:48

标签: xml xslt

给出以下xml输入:

<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”。向后递归?

2 个答案:

答案 0 :(得分:0)

您可以使用“.//node()[ @Pass='True' ]”XPath表达式查看当前节点的任何子节点是否为“True”。

答案 1 :(得分:0)

你可以这样做:

  1. 使用identity transform复制从输入到输出的所有内容,

  2. 对于没有Pass属性的元素节点,请添加它。如果子项中至少有一个False属性值Pass,则设置为False,否则设置为True


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