2017-05-12 5 views
0

こんにちは私は最近XSLTを使ってxmlファイルにtxtメッセージを分割しますが、xsl:matching-substringを使うと問題が発生します。私は正規表現グループ(n)を数えなければならない。とにかく、私はこれらの方法を単純化することができますか?簡単なmataintain行に一致する部分文字列のXSLT regex-groupを簡略化する方法

私がやっている何本:30本の++ライン

の合計について
<xsl:variable name="lineA" as ="xs:string" select="'SAMPLE\+TEXT:1\+((\S+)?):ZZ\+((\S+)?):ZZ\+((\d+)?):((\d+)?)\+((\S+)?)'"/> 
<xsl:variable name="lineB" as ="xs:string" select="'SAMPLE\+ALPHA:2\+((\S+)?):ZZ\+((\S+)?):ZZ\+((\d+)?):((\d+)?)\+((\S+)?)'"/> 
<xsl:variable name="lineC" as ="xs:string" select="'SAMPLE\+BETA:3\+((\S+)?)\+((\S+)?):ZZ\+((\d+)?):((\d+)?)\+((\S+)?)'"/> 

がある

は、このように私が使用します。

<xsl:for-each select="$lines"> 
    <xsl:analyze-string select="." flags="x" 
     regex="({$lineA})\r?\n?({$lineB})?\r?\n?({$lineC})?\r?\n?({$lineD})?\r?\n?({$lineE}).....> 

....ライン30までです++

次に、私は:

<xsl:matching-substring> 
    <line level="0" 
     variableA="{regex-group(1)}" 
     variableB="{regex-group(2)" 
     variableC="{regex=group(3)" 
     variableD="{regex=group(4)" 

これは、維持するのは難しいです正規表現のグループを取得するために30 ++個々の行まで上から下に上記の正規表現をカウントするために私につながる可能性がある。..

にこれを動作するように簡単な方法がありますこのコード行を維持しますか?

+2

簡略化されていますが、完全な入力、希望の出力、現在動作しているXSLTのサンプルを投稿しようとすると役に立ちます。現在のところ、あなたが交換するかどうかはわかりません。 'variable' =" {regex-group(1)} "variableB =" {regex-group(2)} "variableC =" {正規表現グループ(3)} " 'または表現を単純化するための規則 –

+2

最近のバージョンのXSLTプロセッサでは、 'analyze-string'関数を使ってXPath 3.0/3.1をサポートしているので、それをより柔軟に処理できるかもしれません'xsl:analyze-string'の結果よりもXSLT/XPathで処理しやすいXML構造を返す –

答えて

0

通常、処理をより小さなステップに分解するのに役立ちます。

あなたの入力が複数の行で構成されているかのように見えます。異なる論理を使用して各行を処理したいと思っています。

まずは簡単な行に分割します。tokenize($input, '\r?\n')。 はおそらく

<xsl:variable name="lineC" select="$tokens[3]"/> 

のような変数に行を結合し、その後、独自の正規表現でそれぞれの行を処理します。

関連する問題