ããã°ã©ãã³ã°è¨èªXSLT
ããã°ã©ãã³ã°è¨èªXSLTã®ç¹å¾´
- 颿°åè¨èª
- ãã¥ã¼ãªã³ã°å®å ¨
- 弿°ã¯ãã¹ã¦ãã¼ã¯ã¼ã弿°
- ãã¼ã¿æ§é ã¯ãã¹ã¦æ¨æ§é (ã¨ãããXML)
- å ¥åãã¼ã¿ã«èµ·åããããã°ã©ã ãè¨è¿°ããå¿ è¦ããã*1
- C++ã®templateãããé¥ãã«åé·ãªæ§æ
- DSL(XPath)ã®åãåããªãã¨ã»ã¨ãã©ä½ãåºæ¥ãªãä¸éå端ã
ã§ã¯æ©éãHello, world!ã表示ããããããããªä¾ããã
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version = "1.0"> <xsl:template match="/"> Hello, world! </xsl:template> </xsl:stylesheet>
ããã ãã§ã¯ä½ãåºæ¥ãªãã®ã§ãå¼ã³åºãå´ãä½ãå¿
è¦ãããã¾ããã
ãã®åã«ãä¸ã®ãã¡ã¤ã«ãhello.xslã¨ãã¦ä¿åãã¨ãã¦ãã ããã
<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="hello.xsl"?> <main/>
ãããé©å½ãªåå(hello.xmlã¨ã)ã§ä¿åãã¦ããã©ã¦ã¶ã§éãã°ç»é¢ã«Hello, world!ã¨è¡¨ç¤ºãããã¯ãã§ãã
ããã°ã©ãã³ã°è¨èªXSLTã§ã¯ããã®ããã«æä½2ã¤ã®ãã¡ã¤ã«ãå¿
è¦ã¨ãªãããã§ããã
ãªãã¦åããã©ãè¨èªãªãã§ãããããåãããã«ãã©ã¦ã¶ããããã°å®è¡ã§ããJavaScriptã¨æ¯ã¹ã¦ãå
¨ç¶ãæè»½ããç¡ãã§ãã
ã¡ãªã¿ã«JavaScriptã§åããããªãã¨ããããã¨æã£ãããã¢ãã¬ã¹ãã¼ã«
javascript:document.write("Hello, world!");
ã¨å ¥åãã¦Enterãæ¼ãã ãã§ãããæè»½ã§ããã
ãããXSLTããã°ã©ãã¯ãããªäºã§ã¯ãããã¾ããã
XSLTã颿°åè¨èªã§ãããã¨ã示ãããã«ãfoldl颿°ãå®è£
ãã¦ãããã使ã£ã¦sum颿°ãå®è£
ãã¦ã¿ã¾ãããã
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version = "1.0"> <xsl:template name="foldl"> <xsl:param name="func"/> <xsl:param name="init"/> <xsl:param name="list"/> <xsl:if test="$list"> <xsl:variable name="result"> <xsl:apply-templates select="$func[1]"> <xsl:with-param name="arg0" select="$func[position() > 1]"/> <xsl:with-param name="arg1" select="$init"/> <xsl:with-param name="arg2" select="$list[1]"/> </xsl:apply-templates> </xsl:variable> <xsl:call-template name="foldl"> <xsl:with-param name="func" select="$func"/> <xsl:with-param name="init" select="$result"/> <xsl:with-param name="list" select="$list[position() > 1]"/> </xsl:call-template> </xsl:if> <xsl:if test="not($list)"> <xsl:copy-of select="$init"/> </xsl:if> </xsl:template> <xsl:template name="sum" xmlns:add="add"> <xsl:param name="list"/> <xsl:variable name="adder" select="document('')/*/add:*[1]"/> <xsl:call-template name="foldl"> <xsl:with-param name="func" select="$adder"/> <xsl:with-param name="list" select="$list"/> <xsl:with-param name="init" select="0"/> </xsl:call-template> </xsl:template> <xsl:template match="*[namespace-uri()='add']"> <xsl:param name="arg1"/> <xsl:param name="arg2"/> <xsl:value-of select="$arg1 + $arg2"/> </xsl:template> <add:add xmlns:add="add"/> <xsl:template match="/"> <xsl:call-template name="sum"> <xsl:with-param name="list" select="/items/*"/> </xsl:call-template> </xsl:template> </xsl:stylesheet>
ã»ã»ã»ãã¯ãããã ãã§ã¯ä½ãåºæ¥ã¾ããããã¼ã¿ãä½ãå¿
è¦ãããã¾ããã
ã¾ãã¯ä¸ã®ãã¡ã¤ã«ãtooverbose.xslã¨ã§ãååãã¤ãã¦ä¿åãã¦ããã¾ãããã
ããã¦ã以ä¸ã®å
容ã®ãã¡ã¤ã«ãé©å½ãªååã§ä½æãã¦ãã ããã
<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="tooverbose.xsl"?> <items> <item>10</item> <item>5</item> <item>2</item> <item>3</item> <item>11</item> <item>6</item> <item>5</item> </items>
ä½ã£ãXMLããã©ã¦ã¶ã§éãã¨çµæã表示ãããã¯ã*2ã§ãã
ããã«è©³ãããã¨ã¯The Functional Programming Language XSLT - A proof through examplesãèªãã°ãããªããææ¥ããXSLTããã°ã©ãã«ï¼
ä¸å¿ãfoldlã¨sumã®JavaScriptã«ããå®è£ ä¾ãç½®ãã¦ããã¾ããã
function foldl(func, init, ary) { if (ary.length == 0) return init; return foldl(func, func(init, ary[0]), ary.slice(1, ary.length)); } function sum(ary) { return foldl(function(a, b) { return a + b; }, 0, ary); } document.write(sum([10, 5, 2, 3, 11, 6, 5]));
ã»ã»ã»XSLTã®ãã°ããããéç«ã¡ã¾ããï¼