3

私はこのようなことをしたい:

<xsl:analyze-string select="'ABCD'" regex="(A|B|C|D)+">
  <xsl:matching-substring>
     <xsl:for-each select="regex-group(1)">
         <letter><xsl:value-of select="." /></letter>
     </xsl:for-each>                    
  </xsl:matching-substring>
</xsl:analyze-string>

=>

<letter>A</letter>
<letter>B</letter>
<letter>C</letter>
<letter>D</letter>

xsl:analyze-stringしかし、グループでキャプチャされた最後の値のみを保持するため、可能ではないように見えるため、実際の出力は次のとおりです。

<letter>D</letter>    

一般的な問題は、未知の順序で現れる可能性がある既知の値を扱うことです。

4

1 に答える 1

5

xsl:analyze-string文字列内で複数回自動的に繰り返され、一致します。部分文字列に一致するように式を書き直すと、アンカーを使用したり、グループを明示的に繰り返して文字列全体を一度に一致させたりする代わりに、正しい出力が得られます。

<xsl:analyze-string select="'ABCD'" regex="(A|B|C|D)">
  <xsl:matching-substring>
   <letter><xsl:value-of select="regex-group(1)" /></letter>
  </xsl:matching-substring>
</xsl:analyze-string>

=>

<letter>A</letter>
<letter>B</letter>
<letter>C</letter>
<letter>D</letter>

ただし、式の一部が厳密に順序付けられていて、一部が順序付けられていない場合、これはさらに複雑になります。たとえば、それ自体が順序付けされている 2 つの順序付けられていないグループがあるとします。

(1|2|3|4)+(A|B|C|D)+

この正規表現を次のように書き換えても、( as input を使用して)次(1|2|3|4)|(A|B|C|D)の結果を得ることができます。21CB

<number>2</number>
<number>1</number>
<letter>C</letter>
<letter>B</letter>

しかし、書き換えられた正規表現はAB121A3Cなどにも一致し、元の表現と一致するものはありません。誰かがこれに対するより良い解決策を持っているなら、私は非常に興味があります。理想的な解決策は、.NET のように、繰り返されるグループの以前のキャプチャを保持することです。

于 2013-05-23T21:58:13.077 に答える