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