Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xslt:如何规范化数字元素_Xslt - Fatal编程技术网

xslt:如何规范化数字元素

xslt:如何规范化数字元素,xslt,Xslt,我想用XML中现有元素的规范化值向现有XML文件添加一个元素。 任何帮助都将不胜感激 问候 <?xml version="1.0" encoding="UTF-8"?> <top> <Results> <a>no</a> <b>10</b> <c>12</c> <d>9</d> <

我想用XML中现有元素的规范化值向现有XML文件添加一个元素。 任何帮助都将不胜感激

问候

<?xml version="1.0" encoding="UTF-8"?>
<top>
    <Results>
        <a>no</a>
        <b>10</b>
        <c>12</c>
        <d>9</d>
    </Results>
    <Results>
        <a>no</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>

不
10
12
9
不
8.
50
12
不
6.
55
56
对
23
32
34
在上面的示例输入xml中,我想在每个结果中添加“b_nom”元素,其中值为(b)/(最小值为“b”,用a分组)。预期输出如下所示

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

不
10
1.66
12
9
不
8.
1.33
50
12
不
6.
1.
55
56
对
23
1.
32
34
我想你想要

<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:key name="k1" match="Results" use="a"/>

<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="min">
    <xsl:for-each select="key('k1', ../a)">
      <xsl:sort select="b" data-type="number"/>
      <xsl:if test="position() = 1">
        <xsl:value-of select="b"/>
      </xsl:if>
    </xsl:for-each>
  </xsl:variable>
  <b_nom>
    <xsl:value-of select="format-number(. div $min, '0.##')"/>
  </b_nom>
</xsl:template>

</xsl:stylesheet>

以下是样式表的更改版本,其中考虑了标识组的两个值:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:data="http:://example.com/data"
  exclude-result-prefixes="data">

<data:data xmlns="">
  <group>
    <key>no</key>
    <values>
      <value>no</value>
      <value>n</value>
      <value>0</value>
    </values>
  </group>
  <group>
    <key>yes</key>
    <values>
      <value>yes</value>
      <value>y</value>
      <value>1</value>
    </values>
  </group>
</data:data>

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

<xsl:variable name="main-input" select="/"/>

<xsl:variable name="groups" select="document('')/xsl:stylesheet/data:data/group"/>

<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="this" select="."/>
  <xsl:variable name="min">
    <xsl:for-each select="$main-input//Results[a = $groups/values[value = $this/../a]/value]">
      <xsl:sort select="b" data-type="number"/>
      <xsl:if test="position() = 1">
        <xsl:value-of select="b"/>
      </xsl:if>
    </xsl:for-each>
  </xsl:variable>
  <b_nom>
    <xsl:value-of select="format-number(. div $min, '0.##')"/>
  </b_nom>
</xsl:template>

</xsl:stylesheet>

不
不
N
0
对
对
Y
1.
这将转换输入

<?xml version="1.0" encoding="UTF-8"?>
<top>
    <Results>
        <a>no</a>
        <b>10</b>
        <c>12</c>
        <d>9</d>
    </Results>
    <Results>
        <a>n</a>
        <b>8</b>
        <c>50</c>
        <d>12</d>
    </Results>
    <Results>
        <a>0</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>

不
10
12
9
N
8.
50
12
0
6.
55
56
对
23
32
34
输入到输出中

<top>
   <Results>
      <a>no</a>
      <b>10</b>
      <b_nom>1.67</b_nom>
      <c>12</c>
      <d>9</d>
   </Results>
   <Results>
      <a>n</a>
      <b>8</b>
      <b_nom>1.33</b_nom>
      <c>50</c>
      <d>12</d>
   </Results>
   <Results>
      <a>0</a>
      <b>6</b>
      <b_nom>1</b_nom>
      <c>55</c>
      <d>56</d>
   </Results>
   <Results>
      <a>yes</a>
      <b>23</b>
      <b_nom>1</b_nom>
      <c>32</c>
      <d>34</d>
   </Results>
</top>

不
10
1.67
12
9
N
8.
1.33
50
12
0
6.
1.
55
56
对
23
1.
32
34

你说的“b与a分组的最小值”到底是什么意思?你能给出你用来计算b_nom的公式吗??这个解决方案很有效,谢谢。为了进一步理解,是否可以将其扩展为对“a”的某些组具有标准化值“b”,假设“a”可以取“否”、“n”、“false”、“yes”、“y”、“true”的值,我想将它们归为1“否”、“n”、“false”和“2”yes'、'y'、'true'?@user1495523,我提供了第二个代码示例,其中考虑了组成组的值。非常感谢。它解决了我的大部分问题。马丁,我能请你进一步帮助我吗?我想标准化一个新元素,它是两个元素的平均值。(在上面的例子中说c&d)问一个新问题,我相信有人能帮上忙。