0

.NET 製品のドキュメントを作成するための社内ツールを開発しています。

その機能の一部として、通常の段落を<para>タグでラップする必要があります。

<cell>このコンテキストでは、「通常の段落」とは、おそらくいくつかのインライン XML のようなタグを含む 1 行のテキストであることを意味しますが、や などの他のブロック タグ内にはありません<description>

ソースファイルの例:

Description paragraph #1.
Description paragraph #2.
<code>
Method1();
Method2();
</code>
<list type="number">
  <item>
    <description>
      If you need to do something, use the <see cref="P:foo1" /> method.
    </description>
  </item>
  <item>
    <description> The <see cref="P:foo2" /> method does this.
The <see cref="P:foo3" /> method does that.</description>
  </item>
</list>

<section>
<title>Section title</title>
<content>
Section paragraph #1.
Section paragraph #2.
</content>
</section>

これは次のように変換する必要があります。

<para>Description paragraph #1.</para>
<para>Description paragraph #2.</para>
<code>
Method1();
Method2();
</code>
<list type="number">
  <item>
    <description>
      If you need to do something, use the <see cref="P:foo1" /> method.
    </description>
  </item>
  <item>
    <description> The <see cref="P:foo2" /> method does this.
The <see cref="P:foo3" /> method does that.</description>
  </item>
</list>

<section>
<title>Section title</title>
<content>
<para>Section paragraph #1.</para>
<para>Section paragraph #2.</para>
</content>
</section>

正式には、タスクは次のように聞こえます: テキストのすべての行を .. で囲みますが、他のタグの限られたリスト内にない場合だけではありません。CR/LF、タブ、スペース文字などの空白は、タグ内の以降のすべての段落の前後に使用できます。

明らかに、そのために正規表現を使用する必要がありますが、この場合に機能するものを構築することはできませんでした. アイデアやヒントはありますか?

4

2 に答える 2

1

「明らかに正規表現を使用する必要があります」とあなたは言います。多くの人は、その主張に「ない」が欠けていると言うでしょう。このよく知られた回答を参照してください。

外部レベルのタグのネストがないことが確実な場合は、次のような恐ろしい正規表現で分割できる場合があります。

(<list([^<]|<(?!/list))+</list>)|(<code([^<]|<(?!/code))+</code>)|([^\n]+)

非タグ部分の一致を置き換えます。しかし実際には、多くの XML パーサーの 1 つを使用して、単に適切なテキスト ノードを置き換えてみませんか?

于 2013-01-25T11:12:01.497 に答える
0

あなたの例から完全な要件を推定することは困難ですが、あなたの例が典型的なものである場合、次の XSLT 2.0 スタイルシートは、提供されたコンテンツを<wrapper>要素にラップして整形式にした後、仕事をします:

<xsl:template match="/wrapper/*">
  <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="/wrapper/text()">
  <xsl:for-each select="tokenize(., '\n')">
    <para><xsl:copy-of select="."/></para>
  </xsl:for-each>
</xsl:template>
于 2013-01-25T15:24:52.543 に答える