Xml xslt-从子级推断结果

Xml xslt-从子级推断结果,xml,xslt,Xml,Xslt,给定以下xml输入: <Sections> <Section number="1"> <Step number="1"> <SubStep number="1" Pass="True"> <SubSubStep number="1" Pass="True"/> <SubSubStep number="2" Pass="Tru

给定以下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”。向后递归?

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

您可以按如下方式执行:

  • 使用将所有内容从输入复制到输出,以及

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


  • 
    假的
    真的
    
    XSLT不太擅长转换空白,它在XML上工作得更好。:)不需要转换。:)我认为您需要编辑此文件以包含您的XML和所需的输出。哈哈。。。在努力添加代码块之后,我终于让步了,决定阅读指南:)
    <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>