2

問題をいくらか単純化しましたが、それでも問題の本質を捉えていることを願っています。

次の単純な XML ファイルがあるとします。

<main>
  outside1
  ===BEGIN===
    inside1
  ====END====
  outside2
  =BEGIN=
    inside2
  ==END==
  outside3
</main>

次に、次の XSLT 2.0 を使用できます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

<xsl:template match="text()">

  <xsl:analyze-string select="." regex="=+BEGIN=+">
     <xsl:matching-substring>
        <section/>
     </xsl:matching-substring>
     <xsl:non-matching-substring>
          <xsl:analyze-string select="." regex="=+END=+">  
             <xsl:matching-substring>
                <_section/>
             </xsl:matching-substring>
             <xsl:non-matching-substring>
                <xsl:value-of select="."/>
             </xsl:non-matching-substring>
          </xsl:analyze-string>
     </xsl:non-matching-substring>
  </xsl:analyze-string>

</xsl:template>

</xsl:stylesheet>

それを次のように変換します。

<?xml version="1.0" encoding="UTF-8"?>
  outside1
  <section/>
    inside1
  <_section/>
  outside2
  <section/>
    inside2
  <_section/>
  outside3

質問は次のとおりです。

複数の正規表現

上記のように別の正規表現の中にネストするのではなく、2 つの異なる正規表現を一致させるより良い方法はありますか?

  • このように簡単に入れ子にできない場合はどうなりますか?
  • XSL テンプレートを使用して正規表現の一致を照合および変換することはできますtext()か?
    • この場合、正規表現ごとに 1 つずつ、合計 2 つのテンプレートがあります。
    • 可能であれば、これは理想的なソリューションです

正規表現一致で要素を開閉する

明らかに、代わりに:

<section/>
   inside
<_section/>

私が最終的に本当に欲しいのは:

<section>
   inside
</section>

それで、あなたはこれをどのようにしますか?ある正規表現一致で要素を開き、別の正規表現一致で要素を閉じることさえ可能かどうかはわかりません (つまり、近い方の一致がない場合はどうなりますか?結果は整形式の XML にはなりません!)。このタスクは非常に典型的なものであり、慣用的な解決策が必要です。

注: セクションはオーバーラップせず、ネストもしないと想定できます。また、それらは常に適切なペアで表示されると想定することもできます。


追加情報

つまり、本質的に私は、Perl で簡潔に次のようになることを達成しようとしています。

s/=+BEGIN=+/<section>/
s/=+END=+/<\/section>/

代わりに XSLT でこれを行う方法を探しています。

  • 正規表現一致のコンテキストに関しては、より堅牢になります
    • text()(つまり、ノードのみを変換する必要があります)
  • また、さまざまな XML エンティティの一致に関して、より堅牢になります。
4

1 に答える 1

1

This transformation:

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

 <xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="text()">
   <xsl:analyze-string select="." flags="mx"
    regex="=+BEGIN=+((.|\n)*?)=+END=+">

   <xsl:matching-substring>
    <section><xsl:value-of select="regex-group(1)"/></section>
   </xsl:matching-substring>

   <xsl:non-matching-substring>
    <xsl:value-of select="."/>
   </xsl:non-matching-substring>
 </xsl:analyze-string>
 </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document:

<main>
  outside1
  ===BEGIN===
    inside1
  ====END====
  outside2
  =BEGIN=
    inside2
  ==END==
  outside3
</main>

produces the wanted result:

<main>
  outside1
  <section>
    inside1
  </section>
  outside2
  <section>
    inside2
  </section>
  outside3
</main>
于 2010-06-26T15:55:01.110 に答える