XSLとは †
- XSL (eXtensible Stylesheet Language)
- XMLを変換するためのプログラム言語
- XMLで記述されている
- XSLT(XSL Transformations)
- XMLを書式変換するためのプログラム言語
- 難しいので余り使われていない・・・というか使いたくない・・・
- XSL-FO(XSL Formatting Objects)
- XMLに書式情報を追加して表示できるようにするためのプログラム言語
- XSLT よりもさらに難しいので、誰にも使われていない
- 普通は CSS を使う
実行環境 †
XMLStarlet †
- xmllint も併せて使うと便利
xmllint --format ${xml}
でXMLを整形してくれる。
標準入力から、変換元 XML を持ってくるモードはないみたい xmlstarlet tr xsl xml | xmllint --format とかできるとうれしかったんだけど・・・。
Mac OS X には標準で入っている。
MSXML(.NET) †
クライアントサイド(ブラウザ)で変換させる †
Java †
TransformerFactory trfactory = TransformerFactory.newInstance();
Transformer t = trfactory.newTransformer(new StreamSource(xsltInput));
t.transform(new StreamSource(xmlInput), new StreamResult(xmlOutput));
- xsltInput : XSLT を読み込む InputStream?
- xmlInput : XML を読み込む InputStream?
- xmlOutput : XML を出力する OutputStream?
基本的な考え方 †
- koma.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<pieces>
<piece>
<name>玉</name>
<moves>
<move y=" 1" x="-1"/>
<move y=" 1" x=" 0"/>
<move y=" 1" x=" 1"/>
<move y=" 0" x="-1"/>
<move y=" 0" x=" 1"/>
<move y="-1" x="-1"/>
<move y="-1" x=" 0"/>
<move y="-1" x=" 1"/>
</moves>
</piece>
</pieces>
- style.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>KOMA</TITLE>
</HEAD>
<BODY>
<H1>将棋の駒</H1>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
- スタイル適用結果
$ xmlstarlet tr style.xsl koma.xml
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>KOMA</TITLE>
</HEAD>
<BODY><H1>将棋の駒</H1></BODY>
</HTML>
xsl:output †
- <xsl:output method="html" encoding="UTF-8"/>
- 出力形式の指定
- method には、html の他、xml や text を指定できる
- XSLT で CSV を作ることも可能
xsl:template †
- <xsl:template match="/">
- テンプレートの適用ルール。match に当てはまるノードを <xsl:template match="/"></xsl:template> で定義したルールで置き換える
- match で指定するのは、XPath : XML文書の中での位置を表す表記方法
- "/" は、ルートノード
- XSLT は、xsl:template を順に適用する
子要素にテンプレートルールを適用する †
- koma.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<pieces>
<piece>
<name>玉</name>
<description>王将(おうしょう)</description>
<moves>
<move y=" 1" x="-1"/>
<move y=" 1" x=" 0"/>
<move y=" 1" x=" 1"/>
<move y=" 0" x="-1"/>
<move y=" 0" x=" 1"/>
<move y="-1" x="-1"/>
<move y="-1" x=" 0"/>
<move y="-1" x=" 1"/>
</moves>
</piece>
</pieces>
- style.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>KOMA</TITLE>
<link rel="stylesheet" type="text/css" href="style.css" />
</HEAD>
<BODY>
<H1>将棋の駒</H1>
<xsl:apply-templates select="pieces"/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="pieces">
<TABLE BORDER="1">
<TR><TH>駒</TH><TH>読み方</TH><TH>移動範囲</TH></TR>
<xsl:apply-templates select="piece"/>
</TABLE>
</xsl:template>
<xsl:template match="piece">
<TR>
<TD>
<xsl:copy-of select="name"/>
</TD>
<TD>
<xsl:copy-of select="description"/>
</TD>
<TD>
<xsl:apply-templates select="moves"/>
</TD>
</TR>
</xsl:template>
<xsl:template match="moves">
<xsl:apply-templates select="move"/>
</xsl:template>
<xsl:template match="move">
(<xsl:value-of select="@x"/>,<xsl:value-of select="@y"/>)
</xsl:template>
</xsl:stylesheet>
- style.css
name {
color:blue;
font-weight:bold;
font-size:20px;
}
description {
color:gray;
font-style:Italic;
}
- スタイル適用結果
$ xmlstarlet tr style.xsl koma.xml
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>KOMA</TITLE>
<link rel="stylesheet" type="text/css" href="style.css">
</HEAD>
<BODY>
<H1>将棋の駒</H1>
<TABLE BORDER="1">
<TR>
<TH>駒</TH>
<TH>読み方</TH>
<TH>移動範囲</TH>
</TR>
<TR>
<TD><name>玉</name></TD>
<TD><description>王将(おうしょう)</description></TD>
<TD>
(-1, 1)
( 0, 1)
( 1, 1)
(-1, 0)
( 1, 0)
(-1,-1)
( 0,-1)
( 1,-1)
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
CSS †
- 出力するのが XML の場合には
<xsl:template match="/">
<xsl:processing-instruction name="xml-stylesheet">
type="text/css" href="style.css"
</xsl:processing-instruction>
...
</xsl:template>
- 今回は html なので
<link rel="stylesheet" type="text/css" href="style.css" />
xsl:apply-templates †
<xsl:template match="/">
<xsl:apply-templates select="pieces"/>
</xsl:template>
xsl:copy †
<xsl:copy select="name"/>
- 指定したノードをコピーする
<name>玉</name>
に適用すると
name
になる
xsl:copy-of †
<xsl:copy-of select="name"/>
- 指定したノード配下をコピーする
<name>玉</name>
に適用すると
<name>玉</name>
になる
xsl:value-of †
<xsl:value-of select="name"/>
- 指定したノード配下をテキスト化する
<name>玉</name>
に適用すると
玉
になる
XPath †
基本的な使い方 †
要素番号の指定 †
要素名[要素番号]
- koma2.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style2.xsl"?>
<pieces>
<piece>
<name>玉</name>
<value nari="false">9999</value>
<value nari="true">9999</value>
</piece>
<piece>
<name>飛</name>
<value nari="false">8</value>
<value nari="true">10</value>
</piece>
<piece>
<name>角</name>
<value nari="false">8</value>
<value nari="true">10</value>
</piece>
<piece>
<name>金</name>
<value nari="false">6</value>
<value nari="true">6</value>
</piece>
<piece>
<name>銀</name>
<value nari="false">5</value>
<value nari="true">6</value>
</piece>
<piece>
<name>桂</name>
<value nari="false">4</value>
<value nari="true">6</value>
</piece>
<piece>
<name>香</name>
<value nari="false">3</value>
<value nari="true">6</value>
</piece>
<piece>
<name>歩</name>
<value nari="false">1</value>
<value nari="true">7</value>
</piece>
</pieces>
- style2.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>KOMA2</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates select="pieces"/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="pieces">
<xsl:apply-templates select="piece[2]"/>
<xsl:apply-templates select="piece[3]"/>
</xsl:template>
<xsl:template match="piece">
<xsl:value-of select="name"/>
</xsl:template>
</xsl:stylesheet>
- スタイル適用結果
$ xmlstarlet tr style2.xsl koma2.xml
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>KOMA2</TITLE>
</HEAD>
<BODY>飛角</BODY>
</HTML>
値による絞り込み †
<xsl:apply-templates select="要素名[${XPath} 比較演算子 値]"/>
- 比較演算子
表記 | 意味 |
= | equal |
!= | not equal |
> | > : greater than |
>= | >= : greater equal |
< | < : less than |
<= | <= : less equal |
- style2.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>KOMA2</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates select="pieces"/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="pieces">
<xsl:apply-templates select="piece[value >= 10]"/>
</xsl:template>
<xsl:template match="piece">
<xsl:value-of select="name"/>
</xsl:template>
</xsl:stylesheet>
- スタイル適用結果
$ xmlstarlet tr style2.xsl koma2.xml
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>KOMA2</TITLE>
</HEAD>
<BODY>玉飛角</BODY>
</HTML>
関数 †
<xsl:value-of select="関数(${XPath})"/>
- 関数
floor(${XPath}) | 切り捨て |
ceiling(${XPath}) | 切り上げ |
round(${XPath}) | 四捨五入 |
sum(${XPath}) | 合計 |
last() | カレントノードの子要素の個数 |
position() | カレントノードは何番目の要素か |
count(${XPath}) | ${XPath}の個数 |
string-length(${XPath}) | 文字長 |
substring(${XPath},start,end) | startからendの切り取り |
start-with(${XPath},str) | strで始まっているか? |
contains(${XPath},str) | strを含むか? |
translate(${XPath},str1,str2) | str1をstr2で置換 |
- koma2.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style2.xsl"?>
<pieces>
<piece>
<name>玉</name>
<value nari="false">9999</value>
<value nari="true">9999</value>
</piece>
<piece>
<name>飛</name>
<value nari="false">8</value>
<value nari="true">10</value>
</piece>
<piece>
<name>角</name>
<value nari="false">8</value>
<value nari="true">10</value>
</piece>
<piece>
<name>金</name>
<value nari="false">6</value>
<value nari="true">6</value>
</piece>
<piece>
<name>銀</name>
<value nari="false">5</value>
<value nari="true">6</value>
</piece>
<piece>
<name>桂</name>
<value nari="false">4</value>
<value nari="true">6</value>
</piece>
<piece>
<name>香</name>
<value nari="false">3</value>
<value nari="true">6</value>
</piece>
<piece>
<name>歩</name>
<value nari="false">1</value>
<value nari="true">7</value>
</piece>
</pieces>
- style2.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>KOMA2</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates select="pieces"/>
将棋の駒は <xsl:value-of select="count(pieces/piece)"/> 種類
</BODY>
</HTML>
</xsl:template>
<xsl:template match="pieces">
<TABLE BORDER="1">
<TR><TH>駒</TH><TH>駒の価値</TH><TH>成駒の価値</TH><TH>合計価値</TH></TR>
<xsl:apply-templates select="piece"/>
</TABLE>
</xsl:template>
<xsl:template match="piece">
<TR>
<TD>
<xsl:value-of select="name"/>
</TD>
<TD>
<xsl:value-of select="value[@nari = 'false']"/>
</TD>
<TD>
<xsl:value-of select="value[@nari = 'true']"/>
</TD>
<TD>
<xsl:value-of select="sum(value)"/>
</TD>
</TR>
</xsl:template>
</xsl:stylesheet>
- スタイル適用結果
$ xmlstarlet tr style2.xsl koma2.xml
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>KOMA2</TITLE>
</HEAD>
<BODY>
<TABLE BORDER="1">
<TR>
<TH>駒</TH>
<TH>駒の価値</TH>
<TH>成駒の価値</TH>
<TH>合計価値</TH>
</TR>
<TR>
<TD>玉</TD>
<TD>9999</TD>
<TD>9999</TD>
<TD>19998</TD>
</TR>
<TR>
<TD>飛</TD>
<TD>8</TD>
<TD>10</TD>
<TD>18</TD>
</TR>
<TR>
<TD>角</TD>
<TD>8</TD>
<TD>10</TD>
<TD>18</TD>
</TR>
<TR>
<TD>金</TD>
<TD>6</TD>
<TD>6</TD>
<TD>12</TD>
</TR>
<TR>
<TD>銀</TD>
<TD>5</TD>
<TD>6</TD>
<TD>11</TD>
</TR>
<TR>
<TD>桂</TD>
<TD>4</TD>
<TD>6</TD>
<TD>10</TD>
</TR>
<TR>
<TD>香</TD>
<TD>3</TD>
<TD>6</TD>
<TD>9</TD>
</TR>
<TR>
<TD>歩</TD>
<TD>1</TD>
<TD>7</TD>
<TD>8</TD>
</TR>
</TABLE>
将棋の駒は 8 種類
</BODY>
</HTML>
詳細表記 †
条件分岐と要素・属性の追加 †
- koma3.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style3.xsl"?>
<pieces>
<piece>
<name>玉</name>
</piece>
<piece>
<name>飛</name>
</piece>
<piece>
<name>角</name>
</piece>
<piece>
<name>金</name>
</piece>
<piece>
<name>銀</name>
</piece>
<piece>
<name>桂</name>
</piece>
<piece>
<name>香</name>
</piece>
<piece>
<name>歩</name>
</piece>
</pieces>
- style3.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates select="pieces"/>
</xsl:copy>
</xsl:template>
<xsl:template match="pieces">
<xsl:copy>
<xsl:apply-templates select="piece"/>
</xsl:copy>
</xsl:template>
<xsl:template match="piece">
<xsl:copy>
<xsl:apply-templates select="name"/>
</xsl:copy>
</xsl:template>
<xsl:template match="name">
<xsl:copy>
<xsl:attribute name="type">生駒</xsl:attribute>
<xsl:value-of select="."/>
</xsl:copy>
<xsl:choose>
<xsl:when test=". = '飛'">
<xsl:element name="name"><xsl:attribute name="type">成駒</xsl:attribute>龍</xsl:element>
</xsl:when>
<xsl:when test=". = '角'">
<xsl:element name="name"><xsl:attribute name="type">成駒</xsl:attribute>馬</xsl:element>
</xsl:when>
<xsl:when test=". = '銀'">
<xsl:element name="name"><xsl:attribute name="type">成駒</xsl:attribute>全</xsl:element>
</xsl:when>
<xsl:when test=". = '桂'">
<xsl:element name="name"><xsl:attribute name="type">成駒</xsl:attribute>圭</xsl:element>
</xsl:when>
<xsl:when test=". = '香'">
<xsl:element name="name"><xsl:attribute name="type">成駒</xsl:attribute>杏</xsl:element>
</xsl:when>
<xsl:when test=". = '歩'">
<xsl:element name="name"><xsl:attribute name="type">成駒</xsl:attribute>と</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="name"><xsl:attribute name="type">成駒</xsl:attribute></xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
- スタイル適用結果
[~/Desktop]$ xmlstarlet tr style3.xsl koma3.xml > /tmp/koma.xml
[~/Desktop]$ xmllint --format /tmp/koma.xml
<?xml version="1.0" encoding="UTF-8"?>
<pieces>
<piece>
<name type="生駒">玉</name>
<name type="成駒"/>
</piece>
<piece>
<name type="生駒">飛</name>
<name type="成駒">龍</name>
</piece>
<piece>
<name type="生駒">角</name>
<name type="成駒">馬</name>
</piece>
<piece>
<name type="生駒">金</name>
<name type="成駒"/>
</piece>
<piece>
<name type="生駒">銀</name>
<name type="成駒">全</name>
</piece>
<piece>
<name type="生駒">桂</name>
<name type="成駒">圭</name>
</piece>
<piece>
<name type="生駒">香</name>
<name type="成駒">杏</name>
</piece>
<piece>
<name type="生駒">歩</name>
<name type="成駒">と</name>
</piece>
</pieces>
要素の追加 †
<xsl:element name="${タグ名}">${要素}</xsl:element>
<${タグ名}>${要素}</${タグ名}>
属性の追加 †
<xsl:attribute name="${属性名}">${属性}</xsl:attribute>
- XSLT
<xsl:template match="name">
<xsl:copy>
<xsl:attribute name="type">生駒</xsl:attribute>
<xsl:value-of select="."/>
</xsl:copy>
<xsl:element name="name">
<xsl:attribute name="type">成駒</xsl:attribute>
龍
</xsl:element>
</xsl:template>
- 既存のタグに属性を追加するには <xsl:copy> の子要素に <xsl:attribute> を追加する。
- 新しいタグに属性を追加するには <xsl:element> の子要素に <xsl:attribute> を追加する。
- 出力されるXML
<piece>
<name type="生駒">飛</name>
<name type="成駒">龍</name>
</piece>
テキストの追加 †
<xsl:text>${テキスト}</xsl:text>
${テキスト}
条件分岐(xsl:if) †
<xsl:if text="評価式">
評価式が成り立つときに出力する内容
</xsl:if>
条件分岐(xsl:choose, xsl:when, xsl:otherwise) †
else-if を書きたい場合には <xsl:choose> を使う
<xsl:choose>
<xsl:when test=". = '飛'">
<xsl:element name="name"><xsl:attribute name="type">成駒</xsl:attribute>龍</xsl:element>
</xsl:when>
<xsl:when test=". = '角'">
<xsl:element name="name"><xsl:attribute name="type">成駒</xsl:attribute>馬</xsl:element>
</xsl:when>
・・・・
<xsl:otherwise>
<xsl:element name="name"><xsl:attribute name="type">成駒</xsl:attribute></xsl:element>
</xsl:otherwise>
</xsl:choose>
繰り返し †
- 使い方
<xsl:for-each select="${XPath}">
- koma4.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style4.xsl"?>
<pieces>
<piece>
<name>玉</name>
</piece>
<piece>
<name>飛</name>
</piece>
<piece>
<name>角</name>
</piece>
<piece>
<name>金</name>
</piece>
<piece>
<name>銀</name>
</piece>
<piece>
<name>桂</name>
</piece>
<piece>
<name>香</name>
</piece>
<piece>
<name>歩</name>
</piece>
</pieces>
- style4.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates select="pieces"/>
</xsl:copy>
</xsl:template>
<xsl:template match="pieces">
<xsl:copy>
<xsl:for-each select="piece/name">
<piece>
<xsl:value-of select="."/>
</piece>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
- スタイル適用結果
$ xmlstarlet tr ./style4.xsl ./koma4.xml > /tmp/koma.xml
$ xmllint --format /tmp/koma.xml
<?xml version="1.0" encoding="UTF-8"?>
<pieces>
<piece>玉</piece>
<piece>飛</piece>
<piece>角</piece>
<piece>金</piece>
<piece>銀</piece>
<piece>桂</piece>
<piece>香</piece>
<piece>歩</piece>
</pieces>
- <xsl:for-each> は、<xsl:apply-templates> を組み合わせても実現できる
そーっと Sort †
- 使い方
<xsl:sort select="${XPath}" data-type="${datatype}" order="${order}"/>
を <xsl:template> または、<xsl:for-each> にはさむと、<xsl:template> や <xsl:for-each> の結果が指定された順にソートされる
- ${XPath}
- ${datatype}
- ${order}
- ascending(昇順) もしくは descending(降順)。省略時は ascending
- koma5.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style5.xsl"?>
<pieces>
<piece>
<name>玉</name>
<value nari="false">9999</value>
<value nari="true">9999</value>
</piece>
<piece>
<name>飛</name>
<value nari="false">8</value>
<value nari="true">10</value>
</piece>
<piece>
<name>角</name>
<value nari="false">8</value>
<value nari="true">10</value>
</piece>
<piece>
<name>金</name>
<value nari="false">6</value>
<value nari="true">6</value>
</piece>
<piece>
<name>銀</name>
<value nari="false">5</value>
<value nari="true">6</value>
</piece>
<piece>
<name>桂</name>
<value nari="false">4</value>
<value nari="true">6</value>
</piece>
<piece>
<name>香</name>
<value nari="false">3</value>
<value nari="true">6</value>
</piece>
<piece>
<name>歩</name>
<value nari="false">1</value>
<value nari="true">7</value>
</piece>
</pieces>
- style5.xls
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:apply-templates select="pieces"/>
</xsl:template>
<xsl:template match="pieces">
生駒順:
<xsl:apply-templates select="piece">
<xsl:sort select="value[@nari = 'false']" data-type="number" order="descending"/>
</xsl:apply-templates>
成駒順:
<xsl:for-each select="piece">
<xsl:sort select="value[@nari = 'true']" data-type="number" order="descending"/>
<xsl:value-of select="name"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="piece">
<xsl:value-of select="name"/>
</xsl:template>
</xsl:stylesheet>
- スタイル適用結果
$ xmlstarlet tr ./style5.xsl ./koma5.xml
生駒順:
玉飛角金銀桂香歩
成駒順:
玉飛角歩金銀桂香
Numbering †
- 使い方
<xsl:number level="${level}" count="${count}" from="${from}" format="${format} value="{$value}" />
- level : 番号を階層構造にするか? (省略時は single )
- single : 同列のノードに順番に番号を振る
- multiple : 上位の番号に枝番形式で番号を振る (1.1, 1.2 など)
- any : 階層に関係なく順番に番号を振る
- count : カウントするノードを指定する (省略時はカレントノード)
- level が multiple の場合には、count="chapter|paragraph" のように、XPath を | 区切りで指定する
- from : カウントを始めるノードを指定する (省略時は最初のノードから)
- format : 項番の形式 (省略時は "1")
- 1, A, a, ア など
- level が multiple の場合には 1.a などと親ノードの形式も指定する
- value : 任意の数値にする
- <xsl:sort> をする場合には、もとの DOM の順番で項番がふられるので、ソート後の順番にしたいときには value="position()" とする。
- gorin.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="gorin.xsl"?>
<book>
<title>五輪の書</title>
<chapter name="地の巻">
<paragraph>
五つの道をわかち、一まき一まきにしてその利を知らしめんが為に、
地水火空風として五巻に書顕すなり。
</paragraph>
<paragraph>
命を捨てる時は、道具を残さず役に立てたきもの也。道具を役にたてず、
こしに納めて死する事、本意に有るべからず。
</paragraph>
</chapter>
<chapter name="水の巻">
<paragraph>
兵法二天一流の心、水を本として、利方の法をおこなふによって水の巻
として、一流の太刀筋、此書に書顕すもの也。
</paragraph>
<paragraph>
五方のかまへは、上段、中段、下段、右のわきにかまゆる事、左のわきに
かまゆる事、是五方也。構五ツにわかつといへども、皆人をきらん為也。
</paragraph>
</chapter>
<chapter name="火の巻">
<paragraph>
戦の事を、火におもひとつて、戦勝負の事を火の巻として、此巻に書顕す也。
</paragraph>
<paragraph>
無刀にて勝つ心あり。又太刀にてかたざる心あり。
</paragraph>
</chapter>
<chapter name="風の巻">
<paragraph>
兵法、他流の道を知事、他の兵法の流々を書付、風の巻として此巻に顕す所也。
</paragraph>
<paragraph>
世の中におゐて、人をきる事、替る道なし。
</paragraph>
</chapter>
<chapter name="空の巻">
<paragraph>
心意二つの心をみがき、観見二ツの眼をとぎ、少しもくもりなく、まよひの
雲の晴れたる所こそ、実の空としるべき也。
</paragraph>
<paragraph>
物をわきまへざる所を空と見る所、実の空にはあらず。皆まよふ心なり。
</paragraph>
</chapter>
</book>
- gorin.xls
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<html>
<head><title><xsl:value-of select="book/title"/></title></head>
<body>
<h1><xsl:value-of select="book/title"/></h1>
<xsl:apply-templates select="book/chapter"/>
</body>
</html>
</xsl:template>
<xsl:template match="chapter">
<fieldset>
<legend><xsl:number level="multiple"/>.<xsl:value-of select="@name"/></legend>
<xsl:apply-templates select="paragraph"/>
</fieldset>
</xsl:template>
<xsl:template match="paragraph">
<div>
<xsl:number level="multiple" count="chapter|paragraph" format="1.a"/>.<xsl:value-of select="."/>
</div>
</xsl:template>
</xsl:stylesheet>
- スタイル適用結果
$ xmlstarlet tr ./gorin.xsl ./gorin.xml
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>五輪の書</title>
</head>
<body>
<h1>五輪の書</h1>
<fieldset>
<legend>1.地の巻</legend>
<div>1.a.
五つの道をわかち、一まき一まきにしてその利を知らしめんが為に、
地水火空風として五巻に書顕すなり。
</div>
<div>1.b.
命を捨てる時は、道具を残さず役に立てたきもの也。道具を役にたてず、
こしに納めて死する事、本意に有るべからず。
</div>
</fieldset>
<fieldset>
<legend>2.水の巻</legend>
<div>2.a.
兵法二天一流の心、水を本として、利方の法をおこなふによって水の巻
として、一流の太刀筋、此書に書顕すもの也。
</div>
<div>2.b.
五方のかまへは、上段、中段、下段、右のわきにかまゆる事、左のわきに
かまゆる事、是五方也。構五ツにわかつといへども、皆人をきらん為也。
</div>
</fieldset>
<fieldset>
<legend>3.火の巻</legend>
<div>3.a.
戦の事を、火におもひとつて、戦勝負の事を火の巻として、此巻に書顕す也。
</div>
<div>3.b.
無刀にて勝つ心あり。又太刀にてかたざる心あり。
</div>
</fieldset>
<fieldset>
<legend>4.風の巻</legend>
<div>4.a.
兵法、他流の道を知事、他の兵法の流々を書付、風の巻として此巻に顕す所也。
</div>
<div>4.b.
世の中におゐて、人をきる事、替る道なし。
</div>
</fieldset>
<fieldset>
<legend>5.空の巻</legend>
<div>5.a.
心意二つの心をみがき、観見二ツの眼をとぎ、少しもくもりなく、まよひの
雲の晴れたる所こそ、実の空としるべき也。
</div>
<div>5.b.
物をわきまへざる所を空と見る所、実の空にはあらず。皆まよふ心なり。
</div>
</fieldset>
</body>
</html>
include,import †
<xsl:import href="booklist.xsl"/>
<xsl:include href="modified.xsl"/>
- どちらも別の xsl を挿入する
- import, include の順で定義する
- 参照元と参照先に同じ定義があったときの振る舞いが違う
| 参照元 | 参照先 | |
import | ○ | | 差分を追加 |
include | | ○ | 単純な上書き |
グローバル変数 †
ローカル変数 †
Java#XML / HTML