Writer文書から指定したスタイルを持つ段落の内容を取り出すためのフィルターとマクロ

Writer文書から指定したスタイルを持つ段落の内容を取り出すためのフィルターとマクロは,次のとおりです。私(岸 和孝)は,ODF仕様書を日本語訳する作業でODF仕様書内のスキーマ定義だけ(スタイル名が「RelaxNG」の段落)を取り出すことを試みました。ややこしい話ですが,このフィルターとマクロは,ODF形式で表されたODF仕様書からODFに関するスキーマ定義だけを抜き出し別のファイルに出力します。どちらを使っても同じ結果が得られます。なお,赤色表示の箇所を変えると,任意のスタイル名の段落の内容を取り出すことができます。いろいろな応用を試みてください。

このフィルターとマクロのインストールについては,OpenOfficeのケーススタディ−辞書の作成−を参考にしてください。

指定したスタイルを持つ段落の内容を取り出すためのフィルター(ExportDataWithStyle.xsl)

<?xml version="1.0"?>
<!-- ExportDataWithStyle.xsl (C)2007 KISI -->
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml"
            omit-xml-declaration="yes"
            indent="yes" encoding="UTF-8" />

<xsl:param name="STYLE">RelaxNG</xsl:param>  <!-- この場合は「RelaxNG」を検出する -->

<xsl:template match="/">
  <xsl:variable name="T">
    <xsl:for-each select="//style:style"><xsl:if test="@style:parent-style-name = $STYLE"><xsl:value-of select="@style:name" />,</xsl:if></xsl:for-each>
  </xsl:variable>
  <xsl:apply-templates select="//text:p">
    <xsl:with-param name="t" select="$T" />
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="//text:p">
  <xsl:param name="t" />
  <xsl:choose>
    <xsl:when test="@text:style-name = $STYLE">
      <xsl:value-of select="." disable-output-escaping="yes" /><xsl:text>
</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="ss">
        <xsl:with-param name="sn" select="@text:style-name" />
        <xsl:with-param name="st" select="$t" />
        <xsl:with-param name="sv" select="." />
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="ss">
  <xsl:param name="sn" />
  <xsl:param name="st" />
  <xsl:param name="sv" />
  <xsl:variable name="sx"><xsl:value-of select="substring-before($st,',')" /></xsl:variable>
  <xsl:choose>
    <xsl:when test="$sx = ''">
    </xsl:when>
    <xsl:when test="$sn = $sx">
      <xsl:value-of select="$sv" disable-output-escaping="yes" /><xsl:text>
</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="ss">
        <xsl:with-param name="sn" select="$sn" />
        <xsl:with-param name="st" select="substring-after($st,',')" />
        <xsl:with-param name="sv" select="$sv" />
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>

指定したスタイルを持つ段落の内容を取り出すためのBasicマクロ(ExportDataWithStyle.bas)

Sub ExportDataWithStyle 
  ' ExportDataWithStyle.bas (C)2007 KISI
  Dim Path    As String
  Dim Style   As String
  Dim FA      As Object
  Dim O       As Object
  Dim OS      As Object
  Dim Doc     As Object
  Dim Cursor  As Object
  Dim Proceed As Boolean
  Path  = "odf.xsd"  ' この場合は,ルートの「odf.xsd」へ出力する
  Style = "RelaxNG"  ' この場合は「RelaxNG」を検出する
  FA = createUnoService("com.sun.star.ucb.SimpleFileAccess") 
  O  = createUnoService("com.sun.star.io.TextOutputStream")
  OS = FA.openFileWrite(Path)
  OS.truncate() 
  O.setOutputStream(OS) 
  Doc    = ThisComponent
  Cursor = Doc.Text.createTextCursor
  Cursor.gotoStart(True)
  Do 
    Cursor.gotoStartOfParagraph(false) 
    Cursor.gotoEndOfParagraph(true) 
    If (Cursor.ParaStyleName = Style) Then
      O.writeString(Cursor.getString() & chr(10))
    End IF 
    Proceed = Cursor.gotoNextParagraph(False)
  Loop While Proceed
  O.closeOutput()
End Sub