2013-10-17 121 views
0

我想添加一個元素到現有的XML文件中,使用XML中現有元素的標準化值。 任何幫助將不勝感激。xslt:如何標準化數字元素

問候

<?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」與分組的)。預期的輸出是如下

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

你是什麼意思,'最小的b與a分組'? – venite

+0

你能給出你用來計算'b_nom'的公式嗎? – FrustratedWithFormsDesigner

回答

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

該解決方案運行良好,謝謝。爲了進一步理解,是否有可能將此擴展爲對'a'的某些組賦值'b'的正規化值,假設'a'可能取值爲'no','n','false','yes',以及'y','true',我想將他們分爲1.'不','n','虛假'和2.'是','是','真'? – user1495523

+0

@ user1495523,我已經提供了第二個代碼示例,它將構成組的值考慮在內。 –

+0

非常感謝。它解決了我的大部分問題。 – user1495523