2016-07-03 6 views
1

xslt 2.0を使用して不規則な内容のXMLファイルから文字列をソートしようとしています。XSLT v2.0、xsl:部分文字列ではなく正規表現で並べ替えますか?

リストは、「担当者」の直後の番号に従って注文する必要があります。そして「Nr。」の直後にある数字は無視されます(Tit。、Bd。など)。ここで

は、XML内の文字列の例をいくつか示しています

<a>I. HA Rep. 90, Nr. 45203</a> 
<a>Rep. 89 Nr. 17750</a> 
<a>I. HA Rep. 77, Tit. 500 Nr. 42 Bd. 5</a> 
<a>I. HA Rep. 77, Tit. 500 Nr. 43 Adhibendum</a> 
<a>I. HA Rep. 77 Tit. 343a Nr. 142 Bd. 7</a> 
<a>I. HA Rep. 97 Nr. 5285</a> 

リストは次のようになります。

<a>I. HA Rep. 77, Tit. 500 Nr. 42 Bd. 5</a> 
<a>I. HA Rep. 77, Tit. 500 Nr. 43 Adhibendum</a> 
<a>I. HA Rep. 77 Tit. 343a Nr. 142 Bd. 7</a> 
<a>Rep. 89 Nr. 17750</a> 
<a>I. HA Rep. 90, Nr. 45203</a> 
<a>I. HA Rep. 97 Nr. 5285</a> 

私はXSLTでこれを書いた:

<xsl:sort select="concat(format-number(number(substring-before(substring-after(a, 'Rep. '),', Nr.')),'000'),format-number(number(substring-after(a, 'Nr. ')),'0000000000'))" data-type="number" />' 

このしかし、最も一般的なケース(リストの最初のケース)の場合にのみ有効です。私は正規表現が必要なので、私はこれらの文字列のほぼ1000を持っていますが、私はfn:replace、fn:matchesまたはfn:tokenizeを使用する方法を理解できません。私はそれらのすべてを試しました。 fn:matchだけが真または偽を返します.fn:replaceは、2番目のパラメータ(3番目に必要)でxpathを許可します。おそらくfn:tokenizeを使用しますか?

私はこの簡単な問題に数時間を費やしてきました。この初心者には何かヒントがあります。ここで

+0

:関数 'を使って数値を抽出します。 –

+1

あなたは関数を必要とせず、XSLT 2.0では 'xsl:analyze-string'を' xsl:sort'の子として置くこともできます。 –

答えて

4

:XSL `でユーザー定義関数で解析-STRING`:あなたは` XSLを使用することができ

<xsl:sort select="replace(., '(.*Rep\.\s)(\d+)(.*)', '$2')" data-type="number" order="ascending"/> 
<xsl:sort select="replace(., '(.*Nr\.\s)(\d+)(.*)', '$2')" data-type="number" order="ascending"/> 
+0

どういうわけか、fn:replaceの3番目のパラメータで2番目のパラメータを参照できるかどうかわかりませんでした。私はこれを1〜2行で解決しようとし続けましたが、あきらめました。あなたはそれが可能であることを示した! – Lissy

3

ネストされたxsl:analyze-stringを持つ2つのxsl:sortを使用した例です。

いかが
<xsl:template match="root"> 
    <xsl:copy> 
     <xsl:perform-sort select="a"> 
      <xsl:sort> 
       <xsl:analyze-string select="." regex="Rep\.\s*([0-9]+)"> 
        <xsl:matching-substring> 
         <xsl:sequence select="xs:decimal(regex-group(1))"/> 
        </xsl:matching-substring> 
       </xsl:analyze-string> 
      </xsl:sort> 
      <xsl:sort> 
       <xsl:analyze-string select="." regex="Nr\.\s*([0-9]+)"> 
        <xsl:matching-substring> 
         <xsl:sequence select="xs:decimal(regex-group(1))"/> 
        </xsl:matching-substring> 
       </xsl:analyze-string> 
      </xsl:sort> 
     </xsl:perform-sort> 
    </xsl:copy> 
</xsl:template> 
+0

これはうまくいきまして、私はたくさんのことを学びました。ありがとうございました。 – Lissy

関連する問題