tohokuaikiのチラシの裏

技術的ネタとか。

XSLTのメモ

PHP

<?php
$xml = new DomDocument();
$xml->validateOnParse = true;
$xml->loadXML($xmltext);
$xsl = new DOMDocument();
$xsl->loadXML($xsltext);

$processor = new XSLTProcessor();
$processor->importStyleSheet($xsl);
echo $processor->transformToXML($xml);

だけのを用意して、$xmltextと$xsltextを使って色々やってみる。

気付いたことのメモ。勉強中なので間違っているかもしれないがとりあえず書く。

参考にしたデータXMLやサンプルはこちらから。→サンプルで覚えるXSLTプログラミング

概念として

XSLはプログラムである。上からシーケンシャルにどういった処理を行うかを記述していると考えればよい。

例えば、ROOT要素にというタグを持つXMLを処理する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="/prefectures">
  ......................
  </xsl:template>

というように

PHPのDOMDocumentを扱う時のあれこれ

PHPのDOMDocumentはvalidateOnParseを有効にしてloadXML時にValidateチェックする。この時にNoticeが出ないように。

XSLをほぼ空の状態で適用すると、元のXMLからタグ要素だけとっぱらった形(strip_tagsしたような)もので出してくれるけどこれがただしいXSLTなのかどうかは分からない。

DOCTYPEを入れてDTDを定義
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ac:confluence SYSTEM "confluence-schema/confluence.dtd">
XMLネームスペースはROOT要素で定義
<ac:confluence xmlns:ac="http://www.atlassian.com/schema/confluence/4/ac/"
               xmlns:ri="http://www.atlassian.com/schema/confluence/4/ri/"
               xmlns="http://www.atlassian.com/schema/confluence/4/"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.atlassian.com/schema/confluence/4/ac/ confluence.xsd">

というようにして、とか、とかを使えるようにする。
ROOT要素自体のネームスペースもここで決めるのでROOT自身にもを使ってOK

テンプレート系XSLTエレメント

サンプルで覚えるXSLTプログラミング

template

  1. XSLの基本
  2. 属性には、nameとmatchがある。
  3. nameは唯一性を必要とする
  4. XSLのルート要素直下にのみ作れる
  5. 同じmatchに適用する要素があった場合、最後に適用されたもののみが採用され、あとのものは無視される。
  6. modeをどうやって使うかがいまいちわからない

call-template

name属性で指定した他のテンプレートを1つ呼び出す。

  1. 繰り返しにはならない。適用先のtemplateのXPathのセレクタで複数マッチした場合は先頭の要素だけが適用
  2. の中で使わないといけない