【问题标题】:XSLT total and SubtotalXSLT 总计和小计
【发布时间】:2011-07-23 09:05:30
【问题描述】:

这是我的 XML:

<Forms>
  <Form PRONME="Air Prospect 2" PPRONME="0" TBONUSP="1000" NACRES="2" />
  <Form PRONME="Air Prospect 2" PPRONME="0" TBONUSP="1000" NACRES="2" />
  <Form PRONME="Air Prospect 2" PPRONME="0" TBONUSP="1000" NACRES="2" LDATE="Jul" />
  <Form PRONME="Air Prospect Name" PPRONME="0" NACRES="1" />
  <Form PRONME="Air Prospect Name" PPRONME="0" TBONUSP="1000" NACRES="1" />
  <Total PRONME="Air Prospect 2" PPRONME="0" TBONUSP="3000"  NACRES="6" />
  <Total PRONME="Air Prospect Name" PPRONME="0" NACRES="2" TBONUSP="1000"  />
</Forms>

我想将表单元素打印到一个组中,然后我想打印该组的总计,例如:

<Form PRONME="Air Prospect 2" PPRONME="0" TBONUSP="1000" NACRES="2" />
<Form PRONME="Air Prospect 2" PPRONME="0" TBONUSP="1000" NACRES="2" />
<Form PRONME="Air Prospect 2" PPRONME="0" TBONUSP="1000" NACRES="2" LDATE="Jul" />

看完这个组我想打印

<Total PRONME="Air Prospect 2" PPRONME="0" TBONUSP="3000"  NACRES="6" />

基于 PRONME 我想分组... 使用 XSLT 1.0

【问题讨论】:

  • 您使用什么 XSLT 版本?
  • 我已经尝试稍微清理一下您的问题 - 请验证。如果您定义了“组”的组成部分,将会有所帮助(目前我会猜测 PRONME 属性的值)。
  • 基于 PRONME 我想分组...使用 XSLT 1.0..请帮助我如何做到这一点..

标签: html xml xslt xpath


【解决方案1】:

要以 HTML 格式显示,您可以使用此模板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:key name="k" match="Form" use="@PRONME"/>

  <xsl:template match="/">
    <html>
      <head>
        <style type="text/css">td,th{border:1px solid black}</style>
      </head>
      <table style="border:solid 1px black;border-collapse:collapse">
        <tr>
          <th>PRONME</th>
          <th>PPRONME</th>
          <th>TBONUSP</th>
          <th>NACRES</th>
        </tr>
        <xsl:apply-templates select="*/Form[generate-id(.) = generate-id(key('k', @PRONME))]"/>
      </table>
    </html>
  </xsl:template>

  <xsl:template match="Form">
    <tr>
      <td>
        <xsl:value-of select="@PRONME"/>
      </td>
      <td>
        <xsl:value-of select="@PPRONME"/>
      </td>
      <td>
        <xsl:value-of select="sum(//Form[@PRONME = current()/@PRONME]/@TBONUSP)"/>
      </td>
      <td>
        <xsl:value-of select="sum(//Form[@PRONME = current()/@PRONME]/@NACRES)"/>
      </td>
    </tr>

  </xsl:template>

</xsl:stylesheet>

输出:

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <html>
      <head>
        <style type="text/css">td,th{border:1px solid black}</style>
      </head>
      <table style="border:solid 1px black;border-collapse:collapse">
        <tr>
          <th>PRONME</th>
          <th>PPRONME</th>
          <th>TBONUSP</th>
          <th>NACRES</th>
        </tr>
        <xsl:apply-templates select="*/Total"/>
      </table>
    </html>
  </xsl:template>

  <xsl:template match="Total">
    <xsl:apply-templates select="//Form[@PRONME = current()/@PRONME]"/>

    <tr style="color:red">
      <td>
        <xsl:value-of select="@PRONME"/>
      </td>
      <td>
        <xsl:value-of select="@PPRONME"/>
      </td>
      <td>
        <xsl:value-of select="@TBONUSP"/>
      </td>
      <td>
        <xsl:value-of select="@NACRES"/>
      </td>
    </tr>
  </xsl:template>


  <xsl:template match="Form">

      <tr>
        <td>
          <xsl:value-of select="@PRONME"/>
        </td>
        <td>
          <xsl:value-of select="@PPRONME"/>
        </td>
        <td>
          <xsl:value-of select="@TBONUSP"/>
        </td>
        <td>
          <xsl:value-of select="@NACRES"/>
        </td>
      </tr>

  </xsl:template>

</xsl:stylesheet>

结果:

【讨论】:

  • 以上是我的代码,但我的 inputxml 在开始时已更改为给定格式,因此我需要帮助来阅读不同的标签元素....
  • @Rocky111,更新你的问题,而不是我的答案。
  • 在红线的地方我想打印 元素属性..通过匹配 ProNME ."sum(//Form[@PRONME = current()/@PRONME]/@TBONUSP )" 我不想从 XSLT 进行计算...因为我已经有了 XML 和 元素朋友..
【解决方案2】:

您可以使用这个 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:key name="k" match="Form" use="@PRONME"/>

  <xsl:template match="/">
    <xsl:apply-templates select="*/Form[generate-id(.) = generate-id(key('k', @PRONME))]"/>
  </xsl:template>

  <xsl:template match="Form">
    <Total PRONME="{@PRONME}" PPRONME="{@PPRONME}" 
           TBONUSP="{sum(//Form[@PRONME = current()/@PRONME]/@TBONUSP)}"
           NACRES="{sum(//Form[@PRONME = current()/@PRONME]/@NACRES)}"/>
  </xsl:template>

</xsl:stylesheet>

输出:

<Total PRONME="Air Prospect 2" PPRONME="0" TBONUSP="3000" NACRES="6" />
<Total PRONME="Air Prospect Name" PPRONME="0" TBONUSP="1000" NACRES="2" />

【讨论】:

  • 我在“XML 记事本”中尝试使用您提供的代码.. 但我没有得到任何输出.. 需要更改任何内容...?否则我该如何检查...我对此很陌生,请帮帮我..
  • @Rocky111,我不使用“XML 记事本”。我认为您必须设置输入 XML 和 XSL 模板。然后运行转换过程。我不知道,“XML 记事本”是否将输出 XML 保存到文件或显示在屏幕上。
  • @Rocky111,如果它保存到扩展名为 .htm 的文件中,并且您在浏览器中打开此文件,您将看到任何内容,但您可以查看页面源代码,这将作为我提供的输出。
  • 我将 添加到 XML.... 输出应该正确...???
  • @Rocky111,在浏览器中打开,例如IE 你的 XML。您将看到空白屏幕,这是因为没有要显示的 HTML 内容。
猜你喜欢
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2012-04-19
  • 1970-01-01
相关资源
最近更新 更多