私はxsltの初心者です。私の要件は、ビジネス仕様に従ってxmlファイルをテキストファイルに変換することです。文字列フォーマットの問題の1つで問題が発生しています。何かアイデアがあれば助けてください。
入力xmlデータの一部は次のとおりです: "0001295"
テキストファイルに出力されると予想される結果:1295
私の主な問題は、先行ゼロを削除することです。ロジック/機能があれば共有してください。
この単純な式を使用してください:
_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(., '#')
_
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
これを行うには、いくつかの方法があります。値が完全に数値である場合(たとえば、CSV行やASN0012345などの製品コードの一部ではない場合)、文字列から数値に変換して、再び文字列に戻すことができます。
string(number($value)).
それ以外の場合は、先頭の0を置き換えてください。
replace( $value, '^0*', '' )
'^'が必要です(標準の正規表現構文)。そうでない場合、001201の値は121に置き換えられます(すべてゼロが削除されます)。
お役に立てば幸いです。デイブ
先行ゼロを削除する再帰テンプレートを使用できます。
<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>
XSLT 2.0の単純な代替手段として、先行ゼロの有無にかかわらず、数値または英数字の入力で使用できます。次のことを試してください。
replace( $value, '^0*(..*)', '$1' )
これが機能するのは、^0*
が貪欲であり、(..*)
が最後の先行ゼロの後の残りの入力をキャプチャするためです。 $1
は、キャプチャされたグループを指します。
ゼロのみを含む入力は0
を出力することに注意してください。
<xsl:value-of select="number(.) * 1"/>
私のために働く
XSLT 2.0STRINGから先行ゼロを削除します
<xsl:value-of select="replace( $value, '^0+', '')"/>
すべての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
に変換します。