2012-03-22 13 views
2

要素内の最後の出現箇所を見つける必要があります。この文字列から、例えば 、文字列内の数字を見つけるxslt

<DATA1>States45bx3.33</DATA1> 
<DATA2>States45bx33</DATA2> 

は、私が第一の場合における3.33と第二の場合でのXSLTすなわち、最後の番号の値を取得したいです。 助けていただければ幸いです。

+0

です。小数点がない場合、それは少し簡単だったでしょう。 –

+0

私は2番目のケースのみを扱っている回答はありません。 –

+0

私はそれを試します:) –

答えて

1

OKがここにXSLT 1.0

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <a>States45bx3.33</a> 
    <b>States45bx33</b> 
    <c>asdfs12310.13.0sads23.23</c> 
    <d>asdfs12310.13.0sads23.23z</d> 
    <e>asdfs12310.13.0sads23.23.34</e> 
</root> 

に適用

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <output> 
      <xsl:for-each select="root/*"> 
       <xsl:element name="{name()}"> 
        <xsl:call-template name="getEndNumber"> 
         <xsl:with-param name="input" select="normalize-space(.)"/> 
         <xsl:with-param name="dotIncluded" select="true()"/> 
        </xsl:call-template> 
       </xsl:element> 
      </xsl:for-each> 
     </output> 
    </xsl:template> 

    <xsl:template name="getEndNumber"> 
     <xsl:param name="input"/> 
     <xsl:param name="dotIncluded"/> 
     <xsl:variable name="len" select="string-length($input)"/> 
     <xsl:choose> 
      <xsl:when test="substring($input, $len, 1) &gt;= '0' and substring($input, $len, 1) &lt;= '9'"> 
       <xsl:call-template name="getEndNumber"> 
        <xsl:with-param name="input" select="substring($input, 1, $len - 1)"/> 
        <xsl:with-param name="dotIncluded" select="$dotIncluded"/> 
       </xsl:call-template> 
       <xsl:value-of select="substring($input, $len, 1)"/> 
      </xsl:when> 
      <xsl:when test="substring($input, $len, 1) = '.' and $dotIncluded"> 
       <xsl:call-template name="getEndNumber"> 
        <xsl:with-param name="input" select="substring($input, 1, $len - 1)"/> 
        <xsl:with-param name="dotIncluded" select="false()"/> 
       </xsl:call-template> 
       <xsl:value-of select="substring($input, $len, 1)"/> 
      </xsl:when> 
      <xsl:otherwise/> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

で解決策だ結果を達成するのは少し難しい正直に言うと

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <a>3.33</a> 
    <b>33</b> 
    <c>23.23</c> 
    <d/> 
    <e>23.34</e> 
</output> 
+0

ブラボー!! .. :) +1 –

0

あなたがXSLT 2.0を適用することができます場合は、次を使用します

<xsl:value-of select="replace(., '.*[^.\d](\d*\.?\d+)$', '$1')"/> 

これは、整数または浮動小数点1のいずれか、現在のノードの最後に数を返します。

使用正規表現の説明:[^ \ D]
(1)* =ストリング
(2)の開始時の文字の任意の数のドットではなく数字でない=一文字
(3)(...)グループ$ 1
(4)\ D *によってバックが参照できます。?\ dは+ =オプションの数字+オプションドット+数字
文字列
の(5)$ =終わり(6)1ドルをグループ1に戻す

xsltに入れる:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <output> 
      <xsl:for-each select="root/*"> 
       <num> 
        <xsl:value-of select="replace(., '.*[^.\d](\d*\.?\d+)$', '$1')"/> 
       </num> 
      </xsl:for-each> 
     </output> 
    </xsl:template> 

</xsl:stylesheet> 

が入力に印加さ

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <number>States45bx3.33</number> 
    <number>States45bx33</number> 
    <number>asdfs12310.13.0sads23.23</number> 
</root> 

これは

につながる
<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <num>3.33</num> 
    <num>33</num> 
    <num>23.23</num> 
</output> 
あなたはXSLにこれを置くことができ

:あなたは、単に取得できるように、機能(このために必要なXSLT 2.0)末尾の数字は関数を呼び出すことによって得られ、結果を取り囲む要素は関数の外で行われます。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:custom="http://customFunctions"> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <output> 
      <xsl:for-each select="root/*"> 
       <num> 
        <xsl:value-of select="custom:getNumberAtEnd(.)"/> 
       </num> 
      </xsl:for-each> 
     </output> 
    </xsl:template> 

    <xsl:function name="custom:getNumberAtEnd"> 
     <xsl:param name="input"/> 
     <xsl:value-of select="replace($input, '.*[^.\d](\d*.?\d+)$', '$1')"/> 
    </xsl:function> 

</xsl:stylesheet> 

備考:文字列の最後に数字がない場合、関数呼び出しの結果または以前のxsl:value-ofステートメントは入力文字列全体になります。これを望まないときは、文字列を最初にテストしなければならないでしょう。文字列の末尾が常に整形式であることが確かなときは、以下の正規表現を置き換えることができます。空の文字列である可能性のある最後の非ドット、非桁の後の最後に何かを返します。

<xsl:value-of select="replace($input, '.*[^.\d](.*)$', '$1')"/> 
+0

実際にはXSLT 2.0では簡単ですが、OPにはXSLT1のヘルプが必要です。私は試みましたが、数字間の文字列が一致する文字で始まらない場合、実際には機能しません。 –

+0

@ infantprogrammer'Aravind '完了! – Maestro13

関連する問題