- - PR -
xlinkをコピーしたい.etc...
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-09-08 19:23
XSLT初心者のitohiroです。
今、SVG形式のデータをXSLTで編集しています。 2つ分からないことがあります。 ・<image>のある属性以外の属性をコピーしたい場合 (例えば、下記のx,y以外の属性をコピーしたい) どうすれば良いでしょうか? ・"xlink:href"属性はコピー(or 定義)する方法はあるのでしょうか? 下記にソースを載せます。 もし、お分かりになる点がございましたらご教授願います。 ---------------- 変換元データ(<image>のみ) ---------------- <image x="5" y="12" transform="translate(52,28)" clip-path="url(#clipPath2)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAT0lEQVR42mM8Y/z/ ==" height="16" preserveAspectRatio="none" stroke-width="0.5" stroke-miterlimit="1" /> ---------------- XSLT ---------------- <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://www.w3.org/2000/svg" exclude-result-prefixes="s" version="1.0"> <xsl:param name="width" select="0" /> <xsl:param name="height" select="0" /> <xsl:param name="viewbox_x" select="0" /> <xsl:param name="viewbox_y" select="0" /> <xsl:param name="viewbox_w" select="0" /> <xsl:param name="viewbox_h" select="0" /> <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="s:svg"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:attribute name="width"> <xsl:value-of select="concat($width, 'mm')" /> </xsl:attribute> <xsl:attribute name="height"> <xsl:value-of select="concat($height, 'mm')" /> </xsl:attribute> <xsl:attribute name="viewBox"> <xsl:value-of select="concat($viewbox_x, ' ', $viewbox_y, ' ', $viewbox_w, ' ', $viewbox_h)" /> </xsl:attribute> <xsl:attribute name="style">overflow:visible</xsl:attribute> <xsl:attribute name="xml:space">preserve</xsl:attribute> <xsl:apply-templates /> </xsl:copy> </xsl:template> <xsl:template match="*"> <xsl:copy> <xsl:for-each select="@*"> <xsl:copy /> </xsl:for-each> <xsl:apply-templates /> </xsl:copy> </xsl:template> <xsl:template match="s:image"> <xsl:element name="g" xmlns="http://www.w3.org/2000/svg"> <xsl:attribute name="transform"> <xsl:value-of select="@transform" /> </xsl:attribute> <xsl:attribute name="clip-path"> <xsl:value-of select="@clip-path" /> </xsl:attribute> <xsl:copy> <xsl:for-each select="@*"> <xsl:copy /> </xsl:for-each> <xsl:attribute name="transform"> <xsl:value-of select="concat('translate(', @x, ',', @y, ')')" /> </xsl:attribute> <xsl:attribute name="x" /> <xsl:attribute name="y" /> <xsl:attribute name="clip-path" /> <xsl:attribute name="stroke-width" /> <xsl:attribute name="stroke-miterlimit" /> <xsl:apply-templates /> </xsl:copy> </xsl:element> </xsl:template> <!-- <xsl:template match="s:image"> <xsl:element name="g" xmlns="http://www.w3.org/2000/svg"> <xsl:attribute name="transform"> <xsl:value-of select="@transform" /> </xsl:attribute> <xsl:attribute name="clip-path"> <xsl:value-of select="@clip-path" /> </xsl:attribute> <xsl:element name="image"> <xsl:attribute name="transform"> <xsl:value-of select="concat('translate(', @x, ',', @y, ')')" /> </xsl:attribute> <xsl:attribute name="width"> <xsl:value-of select="@width" /> </xsl:attribute> <!-- xlink生成できない --> <!-- <xsl:attribute name="xlink:href"> <xsl:value-of select="@xlink-href" /> </xsl:attribute> --> <xsl:attribute name="height"> <xsl:value-of select="@height" /> </xsl:attribute> <xsl:attribute name="preserveAspectRatio"> <xsl:value-of select="@preserveAspectRatio" /> </xsl:attribute> </xsl:element> </xsl:element> </xsl:template> --> </xsl:stylesheet> |
|
投稿日時: 2006-09-09 21:51
・<image>のある属性以外の属性をコピーしたい場合
(例えば、下記のx,y以外の属性をコピーしたい) どうすれば良いでしょうか? XSLTの重要概念 カレントノード、XPath式、コンテキストノード、ノードセット を理解する必要があります。 <image>をカレントにしたら、xsl:copy して中で xsl:copy-of select= で @x,@y 以外のものを 選択します。 かな ー--------------- <!-- xlink生成できない --> <!-- <xsl:attribute name="xlink:href"> xlink の名前空間宣言 していますか? [ メッセージ編集済み 編集者: MMX 編集日時 2006-09-09 21:55 ] |
|
投稿日時: 2006-09-11 12:54
ご返答頂き、ありがとうございました。 > MMXさん
--- 引用 --- <image>をカレントにしたら、xsl:copy して中で xsl:copy-of select= で @x,@y 以外のものを 選択します。 XMLパーサにstylesheetのこの位置ではcopy-ofを指定できないと言われました。 --- 引用 --- <!-- xlink生成できない --> <!-- <xsl:attribute name="xlink:href"> xlink の名前空間宣言 していますか? 名前空間を宣言したらコピーできました。 xmlns:xlink="http://www.w3.org/1999/xlink" |
|
投稿日時: 2006-09-11 14:20
恒等変換(通り抜け)の 定番を知らないのが 致命的です(基礎教育の欠如)
7.5 コピー http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm#copying たとえば、自分自身の変換は、xsl:copy を用いて以下のように記述できる。 <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> ========================== 7.1.4 名前付きアトリビュートの集合 http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm#attribute-sets 一種のマクロ定義ですね xsl:attribute-set エレメントに含まれる各 xsl:attribute エレメント内部のテンプレートは、 アトリビュートの集合を使用する ごと にインスタンス化される。 このインスタンス化では、use-attribute-sets アトリビュートまたは xsl:use-attribute-sets アトリビュートを 持つエレメントのインスタンス化で使用するものと同一のカレントノードとカレントノードリストを使用する。 以下の例では、title-style という名前付きアトリビュートの集合を生成し、テンプレートルール内で使用している。 <xsl:template match="chapter/heading"> <fo:block quadding="start" xsl:use-attribute-sets="title-style"> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:attribute-set name="title-style"> <xsl:attribute name="font-size">12pt</xsl:attribute> <xsl:attribute name="font-weight">bold</xsl:attribute> </xsl:attribute-set> ================================================ XSLTは 1.0の仕様としては、ものすごく完成度が高い。 =============================================== <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="SAWAZIRI"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:attribute-set name="ATTRSET"> <xsl:attribute name="xlink:href"> <xsl:value-of select="@xlink:href"/> </xsl:attribute> <xsl:attribute name="transform"> <xsl:value-of select="@transform"/> </xsl:attribute> </xsl:attribute-set> <xsl:template match="/"> <ROOT> <!-- xsl:copy-of select="image"/ --> <xsl:apply-templates select="image"/> </ROOT> </xsl:template> <xsl:template match="image"> <xsl:copy><!-- 除外指定 --> <xsl:copy-of select="@*[local-name(.) != 'x' and local-name(.) != 'y']"/> </xsl:copy> 50万ダウンロードで 1億円 <xsl:copy use-attribute-sets="ATTRSET"/><!-- 指定のみコピー --> </xsl:template> </xsl:stylesheet> ==================== 結果 <?xml version="1.0" encoding="UTF-8"?> <ROOT xmlns:xlink="SAWAZIRI"> <image transform="translate(52,28)" clip-path="url(#clipPath2)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAT0lEQVR42mM8Y/z/ ==" height="16" preserveAspectRatio="none" stroke-width="0.5" stroke-miterlimit="1" /> 50万ダウンロードで 1億円 <image xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAT0lEQVR42mM8Y/z/ ==" transform="translate(52,28)" /> </ROOT> ============================== 上書きもできる <xsl:copy> <xsl:copy-of select="@*"/><!-- いちおう 全コピー --> <xsl:attribute name="x">1234</xsl:attribute> <xsl:attribute name="y">6789</xsl:attribute> </xsl:copy> [ メッセージ編集済み 編集者: MMX 編集日時 2006-09-11 14:41 ] |
1