2つのオプションがあります。
- XSLTに1つの大きなHTMLを作成させ、表示したいセクションを除くすべてのセクションを非表示にします。
- JavaScriptを使用してさまざまな変換を開始し、現在のHTMLの本文を変換によって返されたHTMLの本文に置き換えます。
<xsl:parameter>
変換ごとに提供する必要のあるの値に応じて異なるルートをとる1つのスタイルシートを使用するか、異なるスタイルシートを使用することができます。
次のXMLがあると仮定しましょう(それを呼びましょうtext.xml
):
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<myXml>
<chapter id="c1">
<heading>Heading 1</heading>
<content>This is text of chapter one.</content>
</chapter>
<chapter id="c2">
<heading>Heading 2</heading>
<content>This is text of chapter two.</content>
</chapter>
</myXml>
次に、提案1について、次のことができます。
<?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"/>
<xsl:template match="/">
<html>
<head>
<title></title>
<script type="text/javascript">
function showView(id) {
document.getElementById("dynamicStyle").innerHTML = "#" + id + "{display:inline}";
}
</script>
<style type="text/css">
.view {display:none};
</style>
<style type="text/css" id="dynamicStyle">
#overview{display:inline}
</style>
</head>
<body>
<div class="view overview" id="overview">
<h1>Overview</h1>
<xsl:apply-templates select="myXml/chapter" mode="overview"/>
</div>
<xsl:apply-templates select="myXml/chapter" mode="detail"/>
</body>
</html>
</xsl:template>
<xsl:template match="chapter" mode="overview">
<div><a href="javascript:showView('{@id}')"><xsl:value-of select="heading"/></a></div>
</xsl:template>
<xsl:template match="chapter" mode="detail">
<div class="view detail" id="{@id}">
<div><a href="javascript:showView('overview')">Back to overview</a></div>
<xsl:apply-templates mode="detail"/>
</div>
</xsl:template>
<xsl:template match="heading" mode="detail">
<h1><xsl:value-of select="."/></h1>
</xsl:template>
<xsl:template match="content" mode="detail">
<div><xsl:value-of select="."/></div>
</xsl:template>
</xsl:stylesheet>
重要なのは、ビューごとに個別のdivを作成し、JavaScriptにCSSを変更させることでそれらを切り替えることです。
方法2は次のようになります。
<?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"/>
<xsl:param name="view" select="'overview'"/>
<xsl:template match="/">
<html>
<head>
<title></title>
<script type="text/javascript">
function showView(id) {
document.documentElement.replaceChild(transform(id).body, document.body);
}
function loadXML(fileName,mime) {
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.open("GET",fileName,false);
if(mime) xmlHttpRequest.overrideMimeType(mime);
xmlHttpRequest.send("");
return xmlHttpRequest.responseXML;
}
function transform(view) {
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(loadXML('test.xsl','application/xslt+xml'));
xsltProcessor.setParameter(null,'view',view);
return xsltProcessor.transformToDocument(loadXML('test.xml'),document);
}
</script>
</head>
<body>
<xsl:choose>
<xsl:when test="$view = 'overview'">
<div>
<h1>Overview</h1>
<xsl:apply-templates select="myXml/chapter" mode="overview"/>
</div>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="myXml/chapter[@id = $view]" mode="detail"/>
</xsl:otherwise>
</xsl:choose>
</body>
</html>
</xsl:template>
<xsl:template match="chapter" mode="overview">
<div><a href="javascript:showView('{@id}')"><xsl:value-of select="heading"/></a></div>
</xsl:template>
<xsl:template match="chapter" mode="detail">
<div>
<div><a href="javascript:showView('overview')">Back to overview</a></div>
<xsl:apply-templates mode="detail"/>
</div>
</xsl:template>
<xsl:template match="heading" mode="detail">
<h1><xsl:value-of select="."/></h1>
</xsl:template>
<xsl:template match="content" mode="detail">
<div><xsl:value-of select="."/></div>
</xsl:template>
</xsl:stylesheet>
ここで重要なのは、JavaScriptを使用してスタイルシートとXMLをロードし、JavaScriptオブジェクトXSLTProcessor
を使用して変換を実行してから、ドキュメントの本文を置き換えることです。この例では、異なるパラメーターを持つ1つのスタイルシートを使用していますが、異なるスタイルシートをロードすることもできます。それに応じて関数を調整し、何らかの方法で指定する必要のある変数transform()
に置き換える必要があります。test.xsl