Hatena::Groupxiss

アリゾナではもう働きたくない社長の blog このページをアンテナに追加 RSSフィード

2008-07-16 (Wed)

ゆの in XSLT 2.0

15:03 |  ゆの in XSLT 2.0 - アリゾナではもう働きたくない社長の blog を含むブックマーク はてなブックマーク -  ゆの in XSLT 2.0 - アリゾナではもう働きたくない社長の blog  ゆの in XSLT 2.0 - アリゾナではもう働きたくない社長の blog のブックマークコメント

コード

<?xml version="1.0" encoding="utf-8"?>
<!--バージョン宣言と「xs」および「ひだまり」の名前空間宣言-->
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:ひだまり="http://d.hatena.ne.jp/keyword/%A4%E6%A4%CE%20in%20language">

  <!--独自要素 *1-->
  <ひだまり:スケッチ version="×365">
    X / _ / X &lt; 来週も見てくださいね!
  </ひだまり:スケッチ>

  <!--グローバル変数(引数)-->
  <xsl:param name="ひだまり:filepath" select="'file:/C://hoge/x365.txt'" as="xs:string"/>

  <!--エントリポイント-->
  <xsl:template match="/">
    <!--最終出力-->
    <xsl:result-document href="{$ひだまり:filepath}">
      <xsl:value-of select="ひだまり:unYunoize(document('')/*/ひだまり:スケッチ[position() = 1])"/>
    </xsl:result-document>
  </xsl:template>

  <!--独自関数-->
  <xsl:function name="ひだまり:unYunoize" as="xs:string">
    <!--引数-->
    <xsl:param name="yuno" as="element()"/>
    <!--内容-->
    <xsl:variable name="result">
      <xsl:analyze-string select="$yuno/child::text()" regex="(.*)&lt;(.*)">
        <xsl:matching-substring>
          <!--マッチした regex-group(1) の値 'X / _ / X ' を取得し、
              tokenize 関数により xs:string+ 型のノード集合 ('X', '/', '_', '/', 'X') にし、
              for-each ループにかける。-->
          <!--(この辺りのプロセスに特に意味はない。無理やり紹介したかっただけ。)-->
          <xsl:for-each select="tokenize(regex-group(1), ' ')">
            <xsl:value-of select="
              if (position() = 3)
              then replace(name($yuno), ':', '')
              else ''"/>
          </xsl:for-each>
          <xsl:value-of select="$yuno/@version"/>
          <xsl:value-of select="regex-group(2)"/>
        </xsl:matching-substring>
      </xsl:analyze-string>
    </xsl:variable>
    <!--返り値-->
    <xsl:sequence select="$result"/>
  </xsl:function>

</xsl:stylesheet>

処理前

このスタイルシートデフォルトスタイルシートを適用させないブラウザ (例えば Opera) で開くと「1」のテキストノードだけが実体参照も展開され表示されます:

X / _ / X < 来週も見てくださいね!

要素名とするのも XPath 式とするのも先にやられたので苦肉の策として、ね。。いや、でもこれは実に「XML らしい」と思うんだ!

処理後

処理系に Saxon を使うなら、以下のようなコマンドを実行します:

java -jar saxon -s:yuno-in-xslt20.xsl -xsl:yuno-in-xslt20.xsl

結果 ('file:/C://hoge/x365.txt'):

ひだまりスケッチ×365 来週も見てくださいね![EOF]

ポイント

名無し名無し2008/07/17 11:11すばらしい!

ジャンボジャンボ2008/09/30 00:36operaのバージョン9.27で試してみましたがswfは表示できませんでしたぁ。。

藁にもすがり藁にもすがり2009/05/20 17:25FireFox3.0.10でもFlashは表示されませんでした orz

りらぞうりらぞう2011/06/17 14:19クロームVer12確認表示できましたですよ

InfinityInfinity2012/01/11 13:44Thanks alot - your anewsr solved all my problems after several days struggling

dluhwunuzbdluhwunuzb2012/01/11 21:40wyax3G <a href="http://vjzmsybnjjbf.com/">vjzmsybnjjbf</a>

xbirqqfynsxbirqqfyns2012/01/12 20:01BMrxuq , [url=http://ugihygktodgz.com/]ugihygktodgz[/url], [link=http://owreulnczbeq.com/]owreulnczbeq[/link], http://kzjwktlnnhgs.com/

plfqbljplfqblj2012/01/14 18:46YUBOVh <a href="http://uiswoeubkwfh.com/">uiswoeubkwfh</a>

gsrgemfgsrgemf2012/01/16 04:025im20u , [url=http://drdmwrrhcamy.com/]drdmwrrhcamy[/url], [link=http://jprpaxbonxlr.com/]jprpaxbonxlr[/link], http://fsqceztflkmu.com/

有希紀有希紀2012/02/23 21:28Cool
素晴らしい。
盲点だったけど確かにこれなら従来比でコードも短く済んでかつW3C(XHTML)遵守できますわな。

EmilyEmily2013/08/08 23:26Just cause it's simple doesn't mean it's not super helpufl.

LoloLolo2013/08/10 20:11Dag nabbit good stuff you whnsrerpiappeps! http://tnsgla.com [url=http://zghklvxeg.com]zghklvxeg[/url] [link=http://yycgihoe.com]yycgihoe[/link]

AhmoevaAhmoeva2013/08/15 19:20That kind of thnkiing shows you're an expert http://xkdzjv.com [url=http://ixfrxtwfqaq.com]ixfrxtwfqaq[/url] [link=http://psyskzlwejc.com]psyskzlwejc[/link]