XSLTProcessor
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2015å¹´7æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
XSLTProcessor ã¯ãXSLT ã¹ã¿ã¤ã«ã·ã¼ã夿ã XML ææ¸ã«é©ç¨ãã¦ãæ°ãã XML ææ¸ãåºåã¨ãã¦çæãã¾ãã XSLT ã¹ã¿ã¤ã«ã·ã¼ãããã¼ããã <xsl:param> 弿°ã®å¤ãæä½ãã夿å¦çãææ¸ã«é©ç¨ããã¡ã½ãããæã£ã¦ãã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã¼
XSLTProcessor()-
æ°ãã
XSLTProcessorã使ãã¾ãã
ã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãã
XSLTProcessor.importStylesheet()-
XSLT ã¹ã¿ã¤ã«ã·ã¼ããã¤ã³ãã¼ããã¾ãã æå®ããããã¼ããææ¸ãã¼ãã®å ´åã¯ãå®å ¨ãª XSL Transform ã¾ãã¯ãªãã©ã«ã®çµæè¦ç´ ã®å¤æã渡ããã¨ãã§ãã¾ãã ãã以å¤ã®å ´åã¯ã
<xsl:stylesheet>ã¾ãã¯<xsl:transform>è¦ç´ ã§ãªããã°ãªãã¾ããã XSLTProcessor.transformToFragment()-
XSLTProcessor.importStylesheet()颿°ã使ç¨ãã¦ã¤ã³ãã¼ããã XSLT ã¹ã¿ã¤ã«ã·ã¼ããé©ç¨ãã¦ããã¼ãã½ã¼ã¹ã夿ãã¾ãã çµæã¨ãã¦å¾ãããææ¸ã®æçã®ãªã¼ãã¼ææ¸ã¯ææè ãã¼ãã§ãã XSLTProcessor.transformToDocument()-
XSLTProcessor.importStylesheet()颿°ã使ç¨ãã¦ã¤ã³ãã¼ãããã XSLT ã¹ã¿ã¤ã«ã·ã¼ããé©ç¨ãã¦ããã¼ãã½ã¼ã¹ã夿ãã¾ãã XSLTProcessor.setParameter()-
ã¤ã³ãã¼ãããã XSLT ã¹ã¿ã¤ã«ã·ã¼ãã«å¼æ° (
<xsl:param>) ãè¨å®ãã¾ãã XSLTProcessor.getParameter()-
XSLT ã¹ã¿ã¤ã«ã·ã¼ããã弿°ã®å¤ãåå¾ãã¾ãã
XSLTProcessor.removeParameter()-
弿°ã以åã«è¨å®ããã¦ããå ´åã¯åé¤ãã¾ãã ããã«ããã
XSLTProcessor㯠XSLT ã¹ã¿ã¤ã«ã·ã¼ãã§æå®ããã弿°ã®æ¢å®å¤ã使ç¨ãã¾ãã XSLTProcessor.clearParameters()-
è¨å®ããã弿°ã
XSLTProcessorãããã¹ã¦åé¤ãã¾ããXSLTProcessor㯠XSLT ã¹ã¿ã¤ã«ã·ã¼ãã§æå®ããã¦ããæ¢å®å¤ã使ç¨ãã¾ãã XSLTProcessor.reset()-
ãã¹ã¦ã®å¼æ°ã¨ã¹ã¿ã¤ã«ã·ã¼ãã
XSLTProcessorããåé¤ãã¾ãã
ã¤ã³ã¹ã¿ã³ã¹ããããã£
ãã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã«ã¯ããããã£ãããã¾ããã
ä¾
>XSLTProcessor ã®ã¤ã³ã¹ã¿ã³ã¹å
async function init() {
const parser = new DOMParser();
const xsltProcessor = new XSLTProcessor();
// XSLT ãã¡ã¤ã« example1.xsl ãèªã¿è¾¼ã¿
const xslResponse = await fetch("example1.xsl");
const xslText = await xslResponse.text();
const xslStylesheet = parser.parseFromString(xslText, "application/xml");
xsltProcessor.importStylesheet(xslStylesheet);
// ãã¡ã¤ã«ãå¦ç
// ...
}
ææ¸ã® DOM ã®ä¸é¨åã«åºã¥ã㦠XML ææ¸ã使ãã
å®éã®å¤æãè¡ãã«ã¯ã XSLTProcessor 㯠XML ææ¸ãå¿
è¦ã¨ãã¾ãããã® XML ææ¸ã¯ãã¤ã³ãã¼ãããã XSL ãã¡ã¤ã«ã¨çµã¿åããã¦ä½¿ç¨ãããæçµçãªçµæãçæãã¾ãã XML ææ¸ã¯ fetch() ã使ç¨ãã¦èªã¿è¾¼ã¾ããåå¥ã® XML ãã¡ã¤ã«ã§ãã£ã¦ãããããæ¢åã®ãã¼ã¸ã®ä¸é¨ã§ãå¯è½ã§ãã
ãã¼ã¸ã® DOM ã®ä¸é¨ãå¦çããã«ã¯ãã¾ãã¡ã¢ãªã¼å
ã« XML ææ¸ã使ããå¿
è¦ãããã¾ããå¦ç対象㮠DOM ãã id ã example ã§ããè¦ç´ ã«å«ã¾ãã¦ããã¨ä»®å®ããã¨ããã® DOM ã¯ã¡ã¢ãªã¼å
ã® XML ææ¸ã® Document.importNode() ã¡ã½ããã使ç¨ãã¦ãè¤è£½ããããã¨ãã§ãã¾ãã Document.importNode() ã使ç¨ããã¨ãDOM ã®æçãææ¸éã§è»¢éãããã¨ãã§ãã¾ãããã®å ´åãHTML ææ¸ãã XML ææ¸ã«è»¢éãã¾ããæåã®å¼æ°ã¯ãè¤è£½ãã DOM ãã¼ããåç
§ãã¾ãã 2 çªç®ã®å¼æ°ã "true" ã«è¨å®ããã¨ãåå«è¦ç´ ããã¹ã¦è¤è£½ããã¾ãï¼ãã£ã¼ãã¯ãã¼ã³ï¼ãè¤è£½ããã DOM ã¯ã以ä¸ã«ç¤ºãããã«ã Node.appendChild() ã使ç¨ãã¦XMLææ¸ã«æ¿å
¥ãããã¨ãã§ãã¾ãã
// ã¡ã¢ãªã¼å
ã«æ°ãã XML ææ¸ã使
const xmlRef = document.implementation.createDocument("", "", null);
// DOM ã®ä¸é¨ã HTML ææ¸ãã XML ææ¸ã«ç§»åãããã
// importNode ã¯ã XSLT ã§å¦çããããã¼ããè¤è£½ããããã«ä½¿ç¨ãã¾ãã true ãæå®ããã¨ããã£ã¼ãã¯ãã¼ã³ã使ããã¾ãã
const myNode = document.getElementById("example");
const clonedNode = xmlRef.importNode(myNode, true);
// ã¯ãã¼ã³ãã DOM ã XML ææ¸ã«è¿½å ãã
xmlRef.appendChild(clonedNode);
ãã®ã¹ã¿ã¤ã«ã·ã¼ããã¤ã³ãã¼ããããã¨ã XSLTProcessor ã¯å®éã®å¤æãè¡ãããã« 2 ã¤ã®ã¡ã½ãããããªãã¡ XSLTProcessor.transformToDocument() 㨠XSLTProcessor.transformToFragment() ãå®è¡ããå¿
è¦ãããã¾ãã
XSLTProcessor.transformToDocument() ã¯å®å
¨ãª XML ææ¸ãè¿ãã XSLTProcessor.transformToFragment() ã¯æ¢åã®ææ¸ã«ç°¡åã«è¿½å ã§ããææ¸ã®æçãè¿ãã¾ãã ã©ã¡ããã夿ããã XML ææ¸ãæåã®å¼æ°ã¨ãã¦åãåãã¾ãã XSLTProcessor.transformToFragment() ã¯ãçæãããæçãææããææ¸ãªãã¸ã§ã¯ãã§ãã 2 çªç®ã®å¼æ°ãå¿
è¦ã§ãã çæãããæçãç¾å¨ã® HTML ææ¸ã«æ¿å
¥ãããå ´åãææ¸ã渡ãã°ååã§ãã
æååãã XML ææ¸ã使ãã 'XML Soup'
DOMParser ã使ç¨ãã¦ã XML ã®æååãã XML ææ¸ã使ãããã¨ãã§ãã¾ãã
const parser = new DOMParser();
const doc = parser.parseFromString(aStr, "text/xml");
夿ãå®è¡
const fragment = xsltProcessor.transformToFragment(xmlRef, document);
åºæ¬çãªä¾
ãã®åºæ¬çãªä¾ã§ã¯ã XML ãã¡ã¤ã«ãèªã¿è¾¼ã¿ã XSL 夿ãé©ç¨ãã¾ãããããã¯ã HTML ãçæããä¾ã§ä½¿ç¨ããã®ã¨åããã¡ã¤ã«ã§ãã XML ãã¡ã¤ã«ã«ã¯è¨äºãè¨è¿°ããã¦ããã XSL ãã¡ã¤ã«ã¯è¡¨ç¤ºç¨ã®æ å ±ãæ¸å¼åãã¾ãã
XML
<?xml version="1.0"?>
<myNS:Article xmlns:myNS="http://devedge.netscape.com/2002/de">
<myNS:Title>My Article</myNS:Title>
<myNS:Authors>
<myNS:Author company="Foopy Corp.">Mr. Foo</myNS:Author>
<myNS:Author>Mr. Bar</myNS:Author>
</myNS:Authors>
<myNS:Body>
The <b>rain</b> in <u>Spain</u> stays mainly in the plains.
</myNS:Body>
</myNS:Article>
XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myNS="http://devedge.netscape.com/2002/de">
<xsl:output method="html" />
<xsl:template match="/">
<html>
<head>
<title>
<xsl:value-of select="/myNS:Article/myNS:Title"/>
</title>
<style>
.myBox {margin:10px 155px 0 50px; border: 1px dotted #639ACE; padding:0 5px 0 5px;}
</style>
</head>
<body>
<p class="myBox">
<span class="title">
<xsl:value-of select="/myNS:Article/myNS:Title"/>
</span> <br />
Authors: <br />
<xsl:apply-templates select="/myNS:Article/myNS:Authors/myNS:Author"/>
</p>
<p class="myBox">
<xsl:apply-templates select="//myNS:Body"/>
</p>
</body>
</html>
</xsl:template>
<xsl:template match="myNS:Author">
-- <xsl:value-of select="." />
<xsl:if test="@company">
:: <b> <xsl:value-of select="@company" /> </b>
</xsl:if>
<br />
</xsl:template>
<xsl:template match="myNS:Body">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
ãã®ä¾ã§ã¯ã .xsl (xslStylesheet) 㨠.xml (xmlDoc) ãã¡ã¤ã«ã®ä¸¡æ¹ãã¡ã¢ãªã¼ã«èªã¿è¾¼ã¾ãã¾ããæ¬¡ã«ã.xslãã¡ã¤ã«ãã¤ã³ãã¼ããã (xsltProcessor.importStylesheet(xslStylesheet)) ã夿ãå®è¡ããã¾ã (xsltProcessor.transformToFragment(xmlDoc, document))ãããã«ããããã¼ã¸ãèªã¿è¾¼ã¾ããå¾ã«ãæ°ããªãã¼ã¸èªã¿è¾¼ã¿ãéå§ãããã¨ãªãããã¼ã¿ã®åå¾ãå®è¡ããã¾ãã
JavaScript
async function init() {
const parser = new DOMParser();
const xsltProcessor = new XSLTProcessor();
// XSLT ãã¡ã¤ã«ã® example1.xsl ãèªã¿è¾¼ã
const xslResponse = await fetch("example1.xsl");
const xslText = await xslResponse.text();
const xslStylesheet = parser.parseFromString(xslText, "application/xml");
xsltProcessor.importStylesheet(xslStylesheet);
// XML ãã¡ã¤ã«ã® example1.xml ãèªã¿è¾¼ã
const xmlResponse = await fetch("example1.xml");
const xmlText = await xmlResponse.text();
const xmlDoc = parser.parseFromString(xmlText, "application/xml");
const fragment = xsltProcessor.transformToFragment(xmlDoc, document);
document.getElementById("example").textContent = "";
document.getElementById("example").appendChild(fragment);
}
init();
é«åº¦ãªä¾
ãã®é«åº¦ãªä¾ã§ã¯ãè¤æ°ã® div ãã³ã³ãã³ãã«åºã¥ãã¦ã½ã¼ããã¾ããä¾ãã°ãã³ã³ãã³ããè¤æ°åã½ã¼ãããæé ã¨éé ã交äºã«åãæ¿ãããã¨ãã§ãã¾ãã JavaScript ã¯æåã®ã½ã¼ãæã«ã®ã¿ .xsl ãã¡ã¤ã«ãèªã¿è¾¼ã¿ããã¡ã¤ã«ã®èªã¿è¾¼ã¿ãå®äºãã㨠xslLoaded 夿°ã true ã«è¨å®ãã¾ãã XSLTProcessor.getParameter() ã¡ã½ããã使ç¨ãã¦ãã³ã¼ãã¯æé ã¾ãã¯éé ã§ã½ã¼ããããã夿ãããã¨ãã§ãã¾ãã弿°ã空ã®å ´åï¼XSLT ãã¡ã¤ã«ã«ä½ãå¤ãããããã§ã¯ãªããããã½ã¼ããç¾ããæåã®æç¹ï¼ãæ¢å®ã§ã¯æé ã«ãªãã¾ããã½ã¼ãå¤ã¯ã XSLTProcessor.getParameter() ã使ç¨ãã¦è¨å®ãã¾ãã
XSLT ãã¡ã¤ã«ã«ã¯ myOrder ã¨å¼ã°ãã弿°ãåå¨ãã JavaScript ã§ã½ã¼ãæ¹æ³ã夿´ããããã«è¨å®ããã¾ãã xsl:sort è¦ç´ ã® order 屿§ã¯ã $myOrder ã使ç¨ãã¦å¼æ°ã®å¤ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãããã ããå¤ã¯æååã§ã¯ãªã XPATH å¼ã§ããå¿
è¦ãããããã {$myOrder} ã使ç¨ããã¾ãã {} ã使ç¨ãããã¨ã§ãã³ã³ãã³ãã XPath å¼ã¨ãã¦è©ä¾¡ããã¾ãã
夿ãå®äºããã¨ãçµæãææ¸å ã«è¿½å ããã¾ãããã®ä¾ã§ã¯ã追å ãããçµæã示ããã¦ãã¾ãã
XHTML
<div id="example">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
<div>10</div>
</div>
JavaScript
let xslRef;
let xslLoaded = false;
const parser = new DOMParser();
const xsltProcessor = new XSLTProcessor();
let myDOM;
let xmlRef = document.implementation.createDocument("", "", null);
async function sort() {
if (!xslLoaded) {
const response = await fetch("example2.xsl");
const xslText = await response.text();
xslRef = parser.parseFromString(xslText, "application/xml");
xsltProcessor.importStylesheet(xslRef);
xslLoaded = true;
}
// Create a new XML document in memory
xmlRef = document.implementation.createDocument("", "", null);
// We want to move a part of the DOM from an HTML document to an XML document.
// importNode is used to clone the nodes we want to process via XSLT - true makes it do a deep clone
const myNode = document.getElementById("example");
const clonedNode = xmlRef.importNode(myNode, true);
// After cloning, we append
xmlRef.appendChild(clonedNode);
// Set the sorting parameter in the XSL file
const sortVal = xsltProcessor.getParameter(null, "myOrder");
if (sortVal === "" || sortVal === "descending") {
xsltProcessor.setParameter(null, "myOrder", "ascending");
} else {
xsltProcessor.setParameter(null, "myOrder", "descending");
}
// Initiate the transformation
const fragment = xsltProcessor.transformToFragment(xmlRef, document);
// Clear the contents
document.getElementById("example").textContent = "";
myDOM = fragment;
// Add the new content from the transformation
document.getElementById("example").appendChild(fragment);
}
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" />
<xsl:param name="myOrder" />
<xsl:template match="/">
<xsl:apply-templates select="/div//div">
<xsl:sort select="." data-type="number" order="{$myOrder}" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="div">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
仿§æ¸
| 仿§æ¸ |
|---|
| DOM > # interface-xsltprocessor > |