2016-11-07 20 views
-1

私はXSLTの新機能です。 XSLTで次のXMLセグメントを並べ替える必要があります。誰も内部配列の値を並べ替える方法を知っていますか?XSLT配列の値を並べ替え

<Coordinates> 
<Array n="155" type="real">1909.090909090909 1894.7368421052631 1777.7777777777778 1923.076923076923 2000.0 3191.528925619835 3771.025641025641 4609.022727272727 6931.111111111111 7394.8611111111095 3149.4444444444443 4173.596491228071 6090.740740740741 7578.214285714285 7261.25 3369.7478260869566 5986.1621621621625 6515.15625 7138.875000000002 8225.714285714286 3224.5867768595035 6915.27027027027 8103.548387096775 6897.741935483871 8485.166666666666 3662.2988505747126 7968.2307692307695 7770.882352941177 6628.548387096775 8864.642857142857 3429.8863636363635 5785.285714285715 6576.428571428572 6791.8 8715.625 4015.2450980392155 7127.045454545455 6171.041666666667 9326.95652173913 10307.827586206897 3577.6136363636365 6820.000000000001 6308.913043478261 8907.0 9448.392857142857 3452.926829268293 7172.5 7280.0 8653.125 9277.692307692309 3108.3333333333335 4601.282051282052 6530.538461538462 8847.368421052632 8147.105263157895 3258.360655737705 7630.833333333335 6814.333333333333 5513.35294117647 9727.894736842105 2781.2500000000005 6974.21875 7172.5 6459.318181818182 8599.722222222223 3512.0454545454545 5203.5 7422.5 9705.454545454546 9217.631578947368 3608.7820512820513 6385.952380952381 9302.35294117647 6647.857142857143 8054.285714285715 ... 
</Array> 
</Coordinates> 

実際の値を昇順で並べ替える必要があります。

ありがとうございます。

+0

どのXSLTプロセッサを使用しますか? - ヒント: 'tokenize'を検索します。 –

+0

@ michael.hor257k、これを行うための例を教えてください。元のXMLを別のものに最初にコピーして配列の値を並べ替える必要があります。 ' \tます。 \tます。 \tます。 \t \t \t \t \tます。 \t \t \t \t \t \t \t #sort配列値 ' – Shaner

+0

私の質問に答えてください。 –

答えて

1

あなたはXalanの-Jプロセッサを使用している場合は、EXSLT str:tokenize()拡張機能を利用して簡単に行うことができますが:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:str="http://exslt.org/strings" 
extension-element-prefixes="str"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="Array"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:for-each select="str:tokenize(., ' ')"> 
      <xsl:sort select="." data-type="number" order="ascending"/> 
      <xsl:value-of select="."/> 
      <xsl:text> </xsl:text> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

そうでない場合は、あなたが持っているだろう再帰的な名前付きテンプレートを使用して値をトークン化し、結果をノード・セットに変換してからソートすることができます。

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exsl="http://exslt.org/common" 
extension-element-prefixes="exsl"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="Array"> 
    <xsl:variable name="values"> 
     <xsl:call-template name="tokenize"> 
      <xsl:with-param name="text" select="."/> 
     </xsl:call-template> 
    </xsl:variable> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:for-each select="exsl:node-set($values)/value"> 
      <xsl:sort select="." data-type="number" order="ascending"/> 
      <xsl:value-of select="."/> 
      <xsl:text> </xsl:text> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

<xsl:template name="tokenize"> 
    <xsl:param name="text"/> 
    <xsl:param name="delimiter" select="' '"/> 
     <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" /> 
     <xsl:if test="$token"> 
      <value> 
       <xsl:value-of select="$token"/> 
      </value> 
     </xsl:if> 
     <xsl:if test="contains($text, $delimiter)"> 
      <!-- recursive call --> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="text" select="substring-after($text, $delimiter)"/> 
      </xsl:call-template> 
     </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 
-1

1つの解決策は、各タグが値を含む変数を形成することです。そして、xslt 1.0の数値でも動作するメソッドでソートすることができます。私が見ることができるように、あなたの値はスペースで区切られています。

+0

xslt 1.0でもこれを行うにはnode-set()関数が必要です。おそらく@ michael-hor257kがプロセッサーを求めているのでしょう。 –

+0

@Igor R.ありがとうございました。私はあなたの答えが好きです。そして私はこれを[xsl:文字列を分割する方法]として試しました(http://stackoverflow.com/questions/4845660/xsl-how-to-split-strings)。しかし、分割後、ソートは優先順位と競合の理由で有効になりません。分割後のソート方法を知っていますか? – Shaner

+0

これは答えではありません。削除してください。問題をどのように解決するかについての考察は、せいぜいコメントに含まれています。 –

-1

OK、ここに私のソリューションです。部品の信用度はDoes XSLT have a Split() function?

p.s.になります。編集済み - ソートあり

+0

**ソート**部分はどこですか? –

+0

申し訳ありません、忘れました –