- PR -

xlinkをコピーしたい.etc...

1
投稿者投稿内容
itohiro
会議室デビュー日: 2006/09/07
投稿数: 7
投稿日時: 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>
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 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 ]
itohiro
会議室デビュー日: 2006/09/07
投稿数: 7
投稿日時: 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"
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)