【问题标题】:XML sum of values as a new valueXML 值总和作为新值
【发布时间】:2016-03-06 12:35:11
【问题描述】:

我有以下 XML:

<team>
   <name>Sanha</name>
   <players>
      <player>
         <name>Alberto Carreiras</name>
         <skill>7</skill>
      </player>
      <player>
         <name>Uông Bửu Đích</name>
         <skill>8</skill>
      </player>
      ...
   </players>
   <sum>0</sum>
</team>

<team>
...
</team>

是否有一种简单直接的方法来计算skill 的总和并将其插入到标签中?达到以下效果:

<team>
   <name>Sanha</name>
   <players>
      <player>... </player>
      <player>...</player>
      ...
   </players>
   <sum>15</sum>
</team>

我可以使用 XPath 来获得总和:

sum(/team/name["Sanha"]/following-sibling::players/player/skill)

假设我有一个描述这些值的工作 XSD 文件。所有字母都是xsd:string,所有数字都是xsd:float。一切都没有限制。

但是我不知道如何将此值解析为sum 标记。

【问题讨论】:

  • XPath 确实允许您在输入文档中选择节点并根据输入计算值,因此您的 XPath 表达式将计算一个总和,是的。但 XPath 不允许您创建新文档或操作现有文档,添加 sum 元素需要 XSLT 或 XQuery 或支持 XPath 的 DOM。
  • 感谢您的回答。你能告诉我如何用 XSLT 来做吗?我已经看到它就像 XML 和 HTML 的组合。如何将计算放入标签?
  • 那么,为什么78 7.5 之和是?不应该是15吗?

标签: xml xpath xsd count sum


【解决方案1】:

如果您想使用 XSLT 转换文档,请使用带有身份转换模板的样式表以及您想要实现的更改的模板:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

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

    <xsl:template match="team[name = 'Sanha']/sum">
        <xsl:copy>
            <xsl:value-of select="sum(../players/player/skill)"/>
        </xsl:copy>
    </xsl:template>

</xsl:transform>

我不确定您是否只想计算名为 Sanha 的特定团队的总和,如果您想为所有团队计算总和,只需将匹配模式更改为 &lt;xsl:template match="team/sum"&gt;

【讨论】:

  • &lt;xsl:apply-templates select="@*|node()"/&gt; 和被包围的&lt;xsl:template&gt; 是什么意思?第二个&lt;xsl:template&gt; 对我来说很清楚,而不是你的答案。
  • 请参阅usingxml.com/Transforms/XslIdentity 或任何有关 XSLT 的书籍或教程,了解所采用的方法,正如我在回答中所说,它是身份转换模板。
  • xmlplease.com/xsltidentity 也是一个很好的介绍方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多