Xml 合并多个元素的值并取属性字段的平均值

Xml 合并多个元素的值并取属性字段的平均值,xml,xslt,xml-parsing,xslt-1.0,Xml,Xslt,Xml Parsing,Xslt 1.0,我需要合并多个元素的值并取属性字段的平均值 [输入] <xml> <characters> <char a="a1" b="b1" y="y1" z="z1" start="1" weight="100">F</char> <char a="a2" b="b2" y="y2" z="z2" start="0" weight="80">r</char> <char a=

我需要合并多个元素的值并取属性字段的平均值

[输入]

<xml>
   <characters>
       <char a="a1" b="b1" y="y1" z="z1"  start="1" weight="100">F</char>
       <char a="a2" b="b2" y="y2" z="z2"  start="0" weight="80">r</char>
       <char a="a3" b="b3" y="y3" z="z3"  start="0" weight="80">o</char>
       <char a="a4" b="b4" y="y4" z="z4"  start="0" weight="100">m</char>
       <char a="a5" b="b5" y="y5" z="z5"> </char>
       <char a="a6" b="b6" y="y6" z="z6"  start="1" weight="100">a</char>
       <char a="a7" b="b7" y="y7" z="z7"  start="0" weight="80">n</char>
       <char a="a8" b="b8" y="y8" z="z8"  start="0" weight="80">d</char>
       <char a="a9" b="b9" y="y9" z="z9"> </char>
   </characters>
</xml>

F
R
o
M
A.
N
D
[输出]

<xml>
   <data>
       <word>
         <value>From</value>
         <coordinates>a1 b1 y4 z4</coordinates>
         <avgconfidence>90</avgconfidence>
        </word>

        <word>
            <value>and</value>
            <coordinates>a6 b6 y9 z9</coordinates>
            <avgconfidence>90</avgconfidence>
         </word>
  <data>
</xml>

从…起
a1 b1 y4 z4
在里面
. 我确实尝试过xsl:choose。它没有产生预期的结果

[XSLT]

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

    <xsl:template match="/">
        <data>
            <xsl:for-each select="characters">
               <word>
                    <value>
                        <xsl:for-each select="char">
                            <xsl:variable name="rec" select="." />
                            <xsl:if test="$rec/@start='1'">
                                <xsl:text>  <xsl:value-of select="$rec" /></xsl:text>
                            </xsl:if>
                        </xsl:for-each>
                    </value>

                     <coordinates>
            <xsl:value-of select="char[1]/@a"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="char[1]/@b"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="char[last()]/@y"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="char[last()]/@z"/>
        </coordinates>
                    <avgWeight>
                        <xsl:value-of select="sum(characters/char/@weight) div count(characters/char) "/>
                    </avgWeight>
                </word>

            </xsl:for-each>
        </data>
    </xsl:template>
</xsl:stylesheet>


请提供帮助。

有趣的问题-您的部分XSL将适用于单个单词,但您需要一种方法将字符分割为单独的单词,并分别处理每个单词。我将其视为一个分组任务,其中“单词”由一个
char[@start='1']
元素及其以下
char[@start='0']
元素组成。因此,您可以使用一个键将每个非单词的首字母
char
与其单词的开头(即其最近的前一个
start='1'
同级)关联起来


当运行样本输入时,会产生

<xml>
  <data>
    <word>
      <value>From</value>
      <coordinates>a1 b1 y4 z4</coordinates>
      <avgconfidence>90</avgconfidence>
    </word>
    <word>
      <value>and</value>
      <coordinates>a6 b6 y8 z8</coordinates>
      <avgconfidence>86.6666666666667</avgconfidence>
    </word>
  </data>
</xml>

从…起
a1 b1 y4 z4
90
和
a6 b6 y8 z8
86.6666666666667

我认为这是正确的答案(末端坐标为
y8z8
而不是
y9z9
,第二个单词的置信度为862/3而不是90)。

完美的解决方案。。!谢谢你,罗伯茨。
<xml>
  <data>
    <word>
      <value>From</value>
      <coordinates>a1 b1 y4 z4</coordinates>
      <avgconfidence>90</avgconfidence>
    </word>
    <word>
      <value>and</value>
      <coordinates>a6 b6 y8 z8</coordinates>
      <avgconfidence>86.6666666666667</avgconfidence>
    </word>
  </data>
</xml>