【问题标题】:xslt sum node values where node valuexslt 对节点值求和,其中节点值
【发布时间】:2015-06-05 20:57:51
【问题描述】:

我有一个 XSLT 文件,它从 XML 文档中收集信息,然后将其呈现为 CSV 文件。

显示所有信息都很好,但是我现在需要做的是汇总节点 i:totalDurationInSeconds 的所有信息,其中 i:issueBatchNumber = D12345

这是我目前的代码

<xsl:template match="/">

<Textblock>Batch Number,Formula Code,Formula Name,Material Code,Material Name,Final Weight, Target Weight, Date, Material Weight, Job Name, Started At, Finished At</Textblock>
<xsl:value-of select="$newline"/>
<xsl:variable name ="BatchIds" select="//i:issues/i:issue"/>

<!-- begin for each loop -->
<xsl:for-each select="$BatchIds">
  <xsl:variable name="currentPosition" select="position()"/>
  <xsl:variable name="nextPosition" select="position()+1"/>
  <xsl:variable name="lastPosition" select="position()-1" />
  <xsl:variable name="lastBatchId" select="//i:issues/i:issue[$lastPosition]/i:issueBatchNumber"/>
  <xsl:variable name="thisBatchId" select="i:issueBatchNumber" />
  <xsl:choose>
    <xsl:when test="not($lastBatchId = $thisBatchId)" >
      <xsl:variable name="startingBatchId" select="//i:issues/i:issue[1]/i:issueBatchNumber"/>
      Batch ID: <xsl:value-of select="i:issueBatchNumber"/><xsl:value-of select="$newline"/>
      Total Time in Seconds: <sum value here -- this is the bit I dont know how to do>
    </xsl:when>
    <xsl:otherwise >

    </xsl:otherwise>
  </xsl:choose>
  outputting csv data here
</xsl:for-each>

这是我正在使用的 xml 数据的示例

<issues>
 <issue>
  <weight>0.903999984264374</weight>
  <materialBatch>
    <Code>WB821</materialCode>
    <weight>0</weight>
    <cost>0</cost>
  </materialBatch>
  <issueBatchNumber>D15601001</issueBatchNumber>
  <jobNumber>Default Job 2015-4</jobNumber>
  <date>2015-04-30T02:36:47</date>
  <dateStarted>2015-04-30T02:33:38</dateStarted>
  <finishedAt>2015-04-30T02:36:03</finishedAt>
  <dispenseDurationInSeconds>144.78</dispenseDurationInSeconds>
 </issue>
     <issue>
  <weight>0.903999984264374</weight>
  <materialBatch>
    <Code>WB821</materialCode>
    <weight>0</weight>
    <cost>0</cost>
  </materialBatch>
  <issueBatchNumber>D15601001</issueBatchNumber>
  <jobNumber>Default Job 2015-4</jobNumber>
  <date>2015-04-30T02:36:47</date>
  <dateStarted>2015-04-30T02:36:03</dateStarted>
  <finishedAt>2015-04-30T02:49.33</finishedAt>
  <dispenseDurationInSeconds>13.3</dispenseDurationInSeconds>
 </issue>
     <issue>
  <weight>0.903999984264374</weight>
  <materialBatch>
    <Code>WB821</materialCode>
    <weight>0</weight>
    <cost>0</cost>
  </materialBatch>
  <issueBatchNumber>D15601001</issueBatchNumber>
  <jobNumber>Default Job 2015-4</jobNumber>
  <date>2015-04-30T02:36:47</date>
  <dateStarted>2015-04-30T02:49.33</dateStarted>
  <finishedAt>2015-04-30T02:54.22</finishedAt>
  <dispenseDurationInSeconds>5.99</dispenseDurationInSeconds>
 </issue>
</issues>

【问题讨论】:

  • 请提供输入 XML,更新 XSLT 以完成,输出 (CSV),然后尝试解释问题。
  • 我添加了一个 XML 输入示例,CSV 输出结果很好,它是我需要帮助的 DispensingDurationInSeconds 的总和,如上所述
  • 你想求和的节点在哪里,在你的样本中看不到,很难回答。您正在寻找这样的东西吗:sum(*[i:issueBatchNumber = D12345]/i:totalDurationInSeconds).但如果没有更多细节,这或多或少是一个完整的猜测......
  • 嗨,埃里克,是的,这就是我正在寻找的那种东西。我会尝试一下,看看我得到了什么
  • @SimonPrice 请将您需要求和的这 3 个值 (144.10, 13.3 and 5.99) 放入您的示例 XML 中,以便我们清楚它们的位置

标签: xslt xslt-1.0


【解决方案1】:

你可以试试这个方法:

<xsl:value-of 
    select="sum(../i:issue[i:issueBatchNumber=$thisBatchId]/i:dispenseDurationInSeconds)">

上面的 xpath 返回来自父级 issue 的所有 dispenseDurationInSeconds 的总和,该元素具有子级 issueBatchNumber 等于当前的 $thisBatchId 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2021-08-24
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多