xslt:如何规范化数值元素

时间:2013-10-17 16:31:17

标签: xslt

我想在现有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>

在上面的示例输入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>

1 个答案:

答案 0 :(得分: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: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>

转换输入

<?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>

进入输出

<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>