使用来自不同父节点值的XSL计算



我已经为此工作了几个小时,我相信你们,社区,将能够想出以下逻辑:

XML节点

<Main>
 <Info>
  <Class Discipline="PHIL" Number="100" Gpa_grade_pts="3" Id_num="0030" Gpa_credits="3" >
  <Class Discipline="HIST" Number="103" Gpa_grade_pts="6" Id_num="0005" Gpa_credits="3" >
  <Class Discipline="HIST" Number="262" Gpa_grade_pts="9" Id_num="0026" Gpa_credits="3" >
 </Info>
 <Section>
  <Class Discipline="HIST" Number="103" Credits="3" Id_num="0030" Code="BAD"/>
  <Class Discipline="HIST" Number="111" Credits="3" Id_num="0005" Code="GOOD"/>
  <Class Discipline="HIST" Number="262" Credits="3" Id_num="0026" Code="BAD"
 </Section>
</Main>

我实际上需要遍历并查找/Section/Class/Code="BAD"的课程,并从以下XSL (GPA)计算中排除这些课程…

XSL

 <xsl:variable name="IdNum">
  <xsl:value-of select="Section/Class[@Code = 'BAD']/@Id_num" />  
 </xsl:variable>  
 <xsl:variable name="GpaGradePts">
  <xsl:value-of select="sum(Info/Class[@Id_num != $IdNum]/@Gpa_grade_pts)" />
 </xsl:variable>
 <xsl:variable name="GpaCredits">
  <xsl:value-of select="sum(Info/Class[@Id_num != $IdNum]/@Gpa_credits)" />
 </xsl:variable>
 <xsl:variable name="Gpa">
  <xsl:value-of select='format-number($GpaGradePts div $GpaCredits, "#.00")' /> <!-- New GPA -->
 </xsl:variable>
 <!-- Display the new value -->
 <xsl:value-of select="$Gpa" />

概要:

我需要比较来自XML的每个各自部分的Id_num节点,确定哪些代码是"BAD"..然后将这些课程从GPA计算中剔除。我的逻辑只有在返回单个/Section/Class[@CODE='BAD']/@Id_num时才有效,因此我需要找到一种方法使所有"BAD"课程在计算中为!=(不包括)。

使用xsl version 1.0

如果您使用<xsl:value-of>来定义变量值,它们将都是字符串,因此最好直接使用xsl:variable中的select属性。

你可以开始收集BAD课程的id(如果MAIN是上下文节点),就像你已经做的那样:

<xsl:variable name="BadIdNums" select="Section/Class[@Code = 'BAD']/@Id_num"/>  

下面是如何使用这个节点集变量作为Info部分中的Course元素的过滤器:

<xsl:variable name="GpaGradePts" 
    select="sum(Info/Class[not(string(@Id_num) = $BadIdNums)]/@Gpa_grade_pts)"/>

要理解过滤器,请记住

如果要比较的一个对象是节点集,另一个对象是字符串,那么比较将为真当且仅当的节点集上执行比较的结果字符串-节点的值,另一个字符串为真。

相关内容

  • 没有找到相关文章

最新更新