8

analyze-stringRegEx内で複数のグループを使用および設定し、一致するすべてのグループを変数に保存して後で使用できるかどうか疑問に思っていました。

そのようです:

<xsl:analyze-string regex="^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee" select=".">
  <xsl:matching-substring>
    <xsl:variable name="varX">
      <xsl:value-of select="regex-group(1)"/>
    </xsl:variable>                                
    <xsl:variable name="varY">
      <xsl:value-of select="regex-group(2)"/>
    </xsl:variable>        
  </xsl:matching-substring>
</xsl:analyze-string>    

これは実際には機能しませんが、それは私が求めていることのようなものですanalyze-string。変数でラップできることはわかっていますが、すべてのグループでRegExを処理する必要があるのは馬鹿げているようです。あまり効率的ではありません。正規表現を一度処理し、後で使用するためにすべてのグループを保存できます。

何か案は?

4

2 に答える 2

9

よくやる

<xsl:variable name="groups" as="element(group)*">
<xsl:analyze-string regex="^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee" select=".">
<xsl:matching-substring>
  <group>
     <x><xsl:value-of select="regex-group(1)"/></x>
     <y><xsl:value-of select="regex-group(2)"/></y>
  </group>   
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:variable>

ヘルプ?そうすれば、キャプチャを含む要素groupsのシーケンスであるという名前の変数があります。group

于 2012-07-28T12:06:50.660 に答える
6

この変換は、xsl:analyze-string必要な結果を得るために必要ではないことを示しています。より単純で汎用的なソリューションが存在します。:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="*[matches(., '^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee')]">

    <xsl:variable name="vTokens" select=
      "tokenize(replace(., '^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee', '$1 $2'), ' ')"/>

  <xsl:variable name="varX" select="$vTokens[1]"/>  
  <xsl:variable name="varY" select="$vTokens[2]"/>  

  <xsl:sequence select="$varX, $varY"/>
 </xsl:template>
</xsl:stylesheet>

この XML ドキュメントに適用した場合:

<t>Blah  123   Bloo  4567  Blee</t>

これにより、必要な正しい結果が得られます。

123 4567

ここでは、RegEx (パラメーターとして提供可能) と文字列を知ることに依存しません。文字列を RegEx グループの区切られた文字列に置き換えるだけです。これをトークン化し、シーケンス内のすべてのアイテムをtokenize()簡単に生成できます。対応する変数に割り当てられます。

temp に埋もれている必要な結果を見つける必要はありません。ツリー - 結果シーケンスでそれらすべてを取得するだけです

于 2012-07-28T16:19:50.520 に答える