niszetの日記

細かい情報を載せていくブログ

(R/OOXML)namespaceがないとw:を入れられない…

という気付きが結構前にあったらしい…

下書きのまま放置していたので、忘れてしまわないうちに書く。

stylexパッケージ、docxのstyleをR上で加工しやすくしようと思って作っていたのですが、docxファイルを記述しているOOXMLは、w:nameのようにw:のnamespaceが与えられています。

xml2パッケージでこのnamespaceつきのタグ、w:nameなどを入れる場合、あらかじめそのnamespaceを定義しているrootを作るなりしないといけないようです(仕様に書いてあるかもしれないけど見つからなかった

例えばこんな感じに。

xml2::xml_new_root(
    "styles",
    "Ignorable"="w14 w15 w16se w16cid w16 w16cex",
    "xmlns:mc"="http://schemas.openxmlformats.org/markup-compatibility/2006",
    "xmlns:r"="http://schemas.openxmlformats.org/officeDocument/2006/relationships",
    "xmlns:w"="http://schemas.openxmlformats.org/wordprocessingml/2006/main",
    "xmlns:w14"="http://schemas.microsoft.com/office/word/2010/wordml",
    "xmlns:w15"="http://schemas.microsoft.com/office/word/2012/wordml",
    "xmlns:w16cex"="http://schemas.microsoft.com/office/word/2018/wordml/cex",
    "xmlns:w16cid"="http://schemas.microsoft.com/office/word/2016/wordml/cid",
    "xmlns:w16"="http://schemas.microsoft.com/office/word/2018/wordml",
    "xmlns:w16se"="http://schemas.microsoft.com/office/word/2015/wordml/symex"
  )

これは実際にPandocで生成したdocxをxml2パッケージで読み込んだ際に含まれていたものを列挙しているだけです。これを、stylexパッケージ中でも使うようにしました。

github.com

コード内に定数を書いている状態なので、新しいPandocが出てきたときなどに更新が入った場合、それに追従しないといけないというデメリットはありますが、現時点でどうなるかわからんものはとりあえず動くことを重視…(毎回Pandocを起動して、docxからnamespaceを抽出して…とやってもいいものの、そこまでする…?という…)

いないと思いますが、R上で同様のことをしようとして詰まった人のために書き残しておきます。