web-dev-qa-db-ja.com

文字列のフォーマット(先行ゼロの削除)

私はxsltの初心者です。私の要件は、ビジネス仕様に従ってxmlファイルをテキストファイルに変換することです。文字列フォーマットの問題の1つで問題が発生しています。何かアイデアがあれば助けてください。

入力xmlデータの一部は次のとおりです: "0001295"

テキストファイルに出力されると予想される結果:1295

私の主な問題は、先行ゼロを削除することです。ロジック/機能があれば共有してください。

14
Hari

この単純な式を使用してください

_number(.)
_

これが完全な例です

_<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="t">
      <xsl:value-of select="number(.)"/>
 </xsl:template>
</xsl:stylesheet>
_

このXMLドキュメントに適用する場合

_<t>0001295</t>
_

必要な正しい結果が生成されます

_1295
_

II。format-number()を使用します

_format-number(., '#')
_
23

XSLT1.0でそれを行うことができる1つの方法があります。

まず、現在値にあるすべてのゼロ要素を削除して、最初の非ゼロ要素を見つけます

<xsl:variable name="first" select="substring(translate(., '0', ''), 1, 1)" />

次に、この最初の文字の前に部分文字列を見つけ、その後に部分文字列を使用して、この後にゼロ以外の部分を取得できます。

<xsl:value-of select="substring-after(., substring-before(., $first))" />

または、2つのステートメントを1つに結合します

<xsl:value-of select="substring-after(., substring-before(., substring(translate(., '0', ''), 1, 1)))" />

したがって、次の入力が与えられます

<a>00012095Kb</a>

次に、次のXSLTを使用します

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/a">
      <xsl:value-of select="substring-after(., substring-before(., substring(translate(., '0', ''), 1, 1)))" />
   </xsl:template>
</xsl:stylesheet>

以下が出力されます

12095Kb
6
Tim C

これを行うには、いくつかの方法があります。値が完全に数値である場合(たとえば、CSV行やASN0012345などの製品コードの一部ではない場合)、文字列から数値に変換して、再び文字列に戻すことができます。

string(number($value)).

それ以外の場合は、先頭の0を置き換えてください。

replace( $value, '^0*', '' )

'^'が必要です(標準の正規表現構文)。そうでない場合、001201の値は121に置き換えられます(すべてゼロが削除されます)。

お役に立てば幸いです。デイブ

5
detheridge02

先行ゼロを削除する再帰テンプレートを使用できます。

<xsl:template name="remove-leading-zeros">
    <xsl:param name="text"/>
    <xsl:choose>
        <xsl:when test="starts-with($text,'0')">
            <xsl:call-template name="remove-leading-zeros">
                <xsl:with-param name="text"
                    select="substring-after($text,'0')"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

次のように呼び出します。

 <xsl:call-template name="remove-leading-zeros">
        <xsl:with-param name="text" select="/path/to/node/with/leading/zeros"/>
    </xsl:call-template>
</xsl:template>
2
Mads Hansen

XSLT 2.0の単純な代替手段として、先行ゼロの有無にかかわらず、数値または英数字の入力で使用できます。次のことを試してください。

replace( $value, '^0*(..*)', '$1' )

これが機能するのは、^0*が貪欲であり、(..*)が最後の先行ゼロの後の残りの入力をキャプチャするためです。 $1は、キャプチャされたグループを指します。

ゼロのみを含む入力は0を出力することに注意してください。

2
<xsl:value-of select="number(.) * 1"/>

私のために働く

1
Henk de Marie

XSLT 2.0STRINGから先行ゼロを削除します

<xsl:value-of select="replace( $value, '^0+', '')"/>
1

すべてのXSLT1パーサーは、人気のある libXML2のXSLT用モジュール のように、 登録関数機能 ...を持っているので、それを使用すると想定できます。 XSLTを呼び出す言語がPHPであると仮定します。 registerPHPFunctionsに関するこのウィキブックス を参照してください。


ビルトインPHP関数ltrimはで使用できます

  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       xmlns:fn="http://php.net/xsl">
   <xsl:output method="xml" encoding="utf-8" indent="yes"/>
   <xsl:template match="test">
       show <xsl:value-of select="fn:function('ltrim',string(.),'0')" />",
   </xsl:template>
  </xsl:stylesheet>

ここで、もう少し複雑な問題を想像してみてください。たとえば、複数の数値を持つ文字列をltrimします。 hello 002 and 021, bye

解決策は同じです。組み込み関数をユーザー定義の関数に変更することを除いて、registerPHPFunctionsを使用します。

function ltrim0_Multi($s) {
    return preg_replace('/(^0+|(?<= )0+)(?=[1-9])/','',$s);
} 

例をhello 2 and 21, byeに変換します。

0
Peter Krauss