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="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。 :) – 2009-10-05 16:24:56

+0

不需要转换。 :)我认为你需要编辑这个来包含你的XML和期望的输出。 – 2009-10-05 16:25:32

+0

哈哈...努力尝试添加代码块后我终于给了,并决定阅读指导方针:) – 2009-10-06 18:15:05

如下你可以这样做:

  1. 使用identity transform一切从输入复制到输出,并且

  2. 元素节点没有Pass属性,添加它。如果儿童中至少有一个Pass属性的值为False,则将其设置为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

谢谢。这正是我所期待的 – 2009-10-06 18:10:56

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