0

你能帮我调试找出错误的根源吗?
我想在 xml 中找到两个元素的平均值并将其添加到最终的 xml 中。
我可能在做一些根本错误的事情,请你帮忙。

提前致谢。公式 s = (c + d)/2

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<top>
    <Results>
        <a>no</a>
        <b>12</b>
        <c>12</c>
        <d>9</d>
    </Results>
    <Results>
        <a>yes</a>
        <b>8</b>
        <c>50</c>
        <d>12</d>
    </Results>
    <Results>
        <a>no</a>
        <b>6</b>
        <c>55</c>
        <d>56</d>
    </Results>
    <Results>
        <a>yes</a>
        <b>23</b>
        <c>32</c>
        <d>34</d>
    </Results>
</top>

.xsl 文件

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

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

  <xsl:variable name="x" select="//c"/>
  <xsl:variable name="y" select="//d"/>

<xsl:template match="b">
  <xsl:call-template name="identity"/>
  <s>
     <xsl:value-of select="($x + $y) div 2"/>
  </s>
</xsl:template>
</xsl:stylesheet>

期望输出

<?xml version="1.0"?>
<top>
  <Results>
    <a>no</a>
    <b>12</b>
    <s>10.5</s>
    <c>12</c>
    <d>9</d>
  </Results>
  <Results>
    <a>yes</a>
    <b>8</b>
    <s>31</s>
    <c>50</c>
    <d>12</d>
  </Results>
  <Results>
    <a>no</a>
    <b>6</b>
    <s>55.5</s>
    <c>55</c>
    <d>56</d>
  </Results>
  <Results>
    <a>yes</a>
    <b>23</b>
    <s>33</s>
    <c>32</c>
    <d>34</d>
  </Results>
</top>

上面的代码和输入是模拟真实数据集的示例。因此,我正在寻找识别此代码中的错误,这是较大代码的一部分。任何帮助都会受到高度评价。

4

2 回答 2

2

你想的太复杂了。

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

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

  <xsl:template match="Results">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
      <s><xsl:value-of select="(sum(c) + sum(d)) div 2" /></s>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

如果您坚持在<Results>元素中使用子顺序,请使用

<xsl:template match="Results">
  <xsl:copy>
    <xsl:apply-templates select="@* | a | b" />
    <s><xsl:value-of select="(sum(c) + sum(d)) div 2" /></s>
    <xsl:apply-templates select="c | d" />
  </xsl:copy>
</xsl:template>

如果只能有一个<c><d>一组,这就足够了:

<xsl:value-of select="(c + d) div 2" />
于 2013-10-18T17:48:37.073 回答
0

我想我已经找到了解决报告问题的方法。

问候

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

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>


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

<xsl:template match="b">
  <xsl:call-template name="identity"/>
  <xsl:variable name="x" select="../c"/>
  <xsl:variable name="y" select="../d"/>
  <s><xsl:value-of select="($x + $y) div 2"/></s>
</xsl:template>
</xsl:stylesheet>
于 2013-10-19T09:01:38.373 回答