liの子要素に%inlineが書ける理由は何かで書いたとおり、htmlではliの下に直接インライン要素を書くことが出来る。
xhtml2ではどうなってるんだろう、とワーキングドラフトを見てみたのだが、やはり(PCDATA|Flow)*と書いてある(あれ、Flow(というかText)自体にはPCDATAが含まれていないのか)。たぶんこれは、liで囲んでいるという時点でインライン要素にはp要素と同じくらい十分な意味づけがされていると考えているのではないか。
DocBookはどうだったっけ、と調べてみたのだが、こちらはlistitemの下にはある程度大きな要素しか書けないようだ。いろんなところの例を見ても、<listitem><para>りんご</para></listitem>みたいに項目ごといちいちparaで囲ってある。これは、listitemは純粋にコンテナの要素としての構造のみを表していて、項目の中身については何も意味づけしないという立場を取っているのではないか。
で、この間からなんでこんなことで悩んでいるのかというと、次のようなWiki記法(軽量マークアップ言語)を解析して内部的な文書モデル(オブジェクト構造)を構築するとき、リストの一行目をParagraphの中に入れるかどうかが問題になるからだ。
次のはリストの例です。 -項目1です。 改行''後''です。 -入れ子の項目 -入れ子の項目 入れ子の後です。 項目1の最後。上の行には先頭に1文字空白が入ってます。 -項目2です。
とりあえずParagraphに入れておいて、html出力するときにListItemの下にParagraphが一つだけならばpで囲まないで出力する、というような手もあるかも。別にすべてpで囲むのがそんなに悪いって分けでもないし。liの下にpを入れると、スタイル上無駄に間隔が空いてしまうことがあるけど、スタイルシートで調整すればいいし。
というわけで、上の例は次のように解釈することにする。
Document Paragraph ParagraphLine Text("次のはリストの例です。") UnorderedList ListItem Paragraph ParagraphLine Text("項目1です。") ParagraphLine Text("改行") Emphasis Text("後") Text("です。") UnorderedList ListItem Paragraph ParagraphLine Text("入れ子の項目") ListItem Paragraph ParagraphLine Text("入れ子の項目") Paragraph ParagraphLine Text("入れ子の後です。") Paragraph ParagraphLine Text("項目1の最後。上の行には先頭に1文字空白が入ってます。") ListItem Paragraph ParagraphLine Text("項目2です。")
ListItemの下にはTextやEmphasisが直接入ることはない。