【问题标题】:Summing related values对相关值求和
【发布时间】:2014-06-26 17:07:56
【问题描述】:

我有这个 .xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
    <orders>
        <order>
            <id>1</id>
            <number>10002</number>
            <type>Loading</type>
            <date>2013-01-01T02:30:00</date>
        </order>
        <order>
            <id>2</id>
            <number>10003</number>
            <type>Loading</type>
            <date>2013-01-01T010:30:00</date>
        </order>
        <order>
            <id>3</id>
            <number>10004</number>
            <type>Loaded</type>
            <date>2013-01-01T12:30:00</date>
        </order>
    </orders>
    <quantities>
        <quantity>
            <id_order>1</id_order>
            <unit>KG</unit>
            <value>1000</value>
        </quantity>
        <quantity>
            <id_order>1</id_order>
            <unit>PAL</unit>
            <value>3</value>
        </quantity>
        <quantity>
            <id_order>1</id_order>
            <unit>M3</unit>
            <value>1.5</value>
        </quantity>
        <quantity>
            <id_order>2</id_order>
            <unit>KG</unit>
            <value>2000</value>
        </quantity>
        <quantity>
            <id_order>2</id_order>
            <unit>PAL</unit>
            <value>4</value>
        </quantity>
        <quantity>
            <id_order>3</id_order>
            <unit>KG</unit>
            <value>5000</value> 
        </quantity>
    </quantities>
</output>

所需的转换类似于

<output>
    <amount>KG</amount>
        <total> "sum of all KG elements" </total>
    <amount>PAL</amount>
        <total> "sum of all PAL elements" </total>
    <amount>M3</amount>
        <total> "sum of all M3 elements" </total>
</output>

我尝试过类似的东西

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


<xsl:template match="/">
<output>
        <xsl:for-each select="output/quantities/quantity"> 
            <amount>
                <xsl:value-of select="unit"/>

                <xsl:for-each select="output/quantities/quantity/value">
                        <xsl:value-of select="sum(output/quantities/quantity/value)"/>   

                </xsl:for-each> 
            </amount>    
        </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

但我没有得到值的总和,并且输出像这样被破坏

<output>
  <amount>KG<total/></amount>
  <amount>PAL<total/></amount>
  <amount>M3<total/></amount>
  <amount>KG<total/></amount>
  <amount>PAL<total/></amount>
  <amount>KG<total/></amount>
</output>

我尝试了一些其他解决方法,但没有一个能达到我想要的输出。如果有人能以任何方式提出任何建议或帮助,我将不胜感激。

现在我尝试在第一个 xml 中添加另一个节点,之后调用该节点基本上应该将复制值的值剥离为仅在数小时后显示 (hh:mm:ss)。我已经设法创建了原始 xml 的副本并添加了额外的标签,但我不确定如何提取小时数据并显示在内部标签中。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>


   <xsl:template match="@* | node()">
      <xsl:copy>
         <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="date">
      <xsl:copy-of select="."/>
      <hour>
<xsl:comment> <xsl:copy-of select="substring(output/orders/order/date,11)"/> </xsl:comment>
       </hour>
   </xsl:template>

</xsl:stylesheet>

【问题讨论】:

  • 我已将您的标题更改为更具描述性的标题。几乎所有 XSLT 问题都与“xslt 将 xml 转换为 xml”有关 - 请尝试表达更多一点。
  • 谢谢你,我设法让它与你的代码一起工作,并进一步派生它以满足我的需要。我感谢您的帮助。我更新了我的下一个问题,我无法将一个标签值复制到另一个创建的标签值中。
  • 我建议您在新问题中发布一个新问题,因为它们似乎不相关。

标签: xml xslt xslt-1.0


【解决方案1】:

试试这个方法:

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

<xsl:key name="qty" match="quantity" use="unit"/>  

<xsl:template match="/">
    <output>
        <amount>KG</amount>
        <total><xsl:value-of select="sum(key('qty', 'KG')/value)"/></total>
        <amount>PAL</amount>
        <total><xsl:value-of select="sum(key('qty', 'PAL')/value)"/></total>
        <amount>M3</amount>
        <total><xsl:value-of select="sum(key('qty', 'M3')/value)"/></total>
    </output>
</xsl:template>

</xsl:stylesheet>

请注意,这不是您可以选择的最佳输出格式;理想情况下,单位和数量将包含在一个公共元素中,而不仅仅是相邻的兄弟元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2019-01-21
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多