1 |
850
|
jones
|
<?xml version="1.0"?>
|
2 |
|
|
<?xml-stylesheet type="text/xsl" href="defaultss.xsl"?>
|
3 |
|
|
<!--
|
4 |
|
|
IE5 default style sheet, provides a view of any XML document
|
5 |
|
|
and provides the following features:
|
6 |
|
|
- auto-indenting of the display, expanding of entity references
|
7 |
|
|
- click or tab/return to expand/collapse
|
8 |
|
|
- color coding of markup
|
9 |
|
|
- color coding of recognized namespaces - xml, xmlns, xsl, dt
|
10 |
|
|
|
11 |
|
|
This style sheet is available in IE5 in a compact form at the URL
|
12 |
|
|
"res://msxml.dll/DEFAULTSS.xsl". This version differs only in the
|
13 |
|
|
addition of comments and whitespace for readability.
|
14 |
|
|
|
15 |
|
|
Author: Jonathan Marsh (jmarsh@microsoft.com)
|
16 |
|
|
-->
|
17 |
|
|
|
18 |
|
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"
|
19 |
|
|
xmlns:dt="urn:schemas-microsoft-com:datatypes"
|
20 |
|
|
xmlns:d2="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882">
|
21 |
|
|
|
22 |
|
|
<xsl:template match="/">
|
23 |
|
|
<HTML>
|
24 |
|
|
<HEAD>
|
25 |
|
|
<STYLE>
|
26 |
|
|
BODY {font:x-small 'Verdana'; margin-right:1.5em}
|
27 |
|
|
<!-- container for expanding/collapsing content -->
|
28 |
|
|
.c {cursor:hand}
|
29 |
|
|
<!-- button - contains +/-/nbsp -->
|
30 |
|
|
.b {color:red; font-family:'Courier New'; font-weight:bold; text-decoration:none}
|
31 |
|
|
<!-- element container -->
|
32 |
|
|
.e {margin-left:1em; text-indent:-1em; margin-right:1em}
|
33 |
|
|
<!-- comment or cdata -->
|
34 |
|
|
.k {margin-left:1em; text-indent:-1em; margin-right:1em}
|
35 |
|
|
<!-- tag -->
|
36 |
|
|
.t {color:#990000}
|
37 |
|
|
<!-- tag in xsl namespace -->
|
38 |
|
|
.xt {color:#990099}
|
39 |
|
|
<!-- attribute in xml or xmlns namespace -->
|
40 |
|
|
.ns {color:red}
|
41 |
|
|
<!-- attribute in dt namespace -->
|
42 |
|
|
.dt {color:green}
|
43 |
|
|
<!-- markup characters -->
|
44 |
|
|
.m {color:blue}
|
45 |
|
|
<!-- text node -->
|
46 |
|
|
.tx {font-weight:bold}
|
47 |
|
|
<!-- multi-line (block) cdata -->
|
48 |
|
|
.db {text-indent:0px; margin-left:1em; margin-top:0px; margin-bottom:0px;
|
49 |
|
|
padding-left:.3em; border-left:1px solid #CCCCCC; font:small Courier}
|
50 |
|
|
<!-- single-line (inline) cdata -->
|
51 |
|
|
.di {font:small Courier}
|
52 |
|
|
<!-- DOCTYPE declaration -->
|
53 |
|
|
.d {color:blue}
|
54 |
|
|
<!-- pi -->
|
55 |
|
|
.pi {color:blue}
|
56 |
|
|
<!-- multi-line (block) comment -->
|
57 |
|
|
.cb {text-indent:0px; margin-left:1em; margin-top:0px; margin-bottom:0px;
|
58 |
|
|
padding-left:.3em; font:small Courier; color:#888888}
|
59 |
|
|
<!-- single-line (inline) comment -->
|
60 |
|
|
.ci {font:small Courier; color:#888888}
|
61 |
|
|
PRE {margin:0px; display:inline}
|
62 |
|
|
</STYLE>
|
63 |
|
|
|
64 |
|
|
<SCRIPT><xsl:comment><![CDATA[
|
65 |
|
|
// Detect and switch the display of CDATA and comments from an inline view
|
66 |
|
|
// to a block view if the comment or CDATA is multi-line.
|
67 |
|
|
function f(e)
|
68 |
|
|
{
|
69 |
|
|
// if this element is an inline comment, and contains more than a single
|
70 |
|
|
// line, turn it into a block comment.
|
71 |
|
|
if (e.className == "ci") {
|
72 |
|
|
if (e.children(0).innerText.indexOf("\n") > 0)
|
73 |
|
|
fix(e, "cb");
|
74 |
|
|
}
|
75 |
|
|
|
76 |
|
|
// if this element is an inline cdata, and contains more than a single
|
77 |
|
|
// line, turn it into a block cdata.
|
78 |
|
|
if (e.className == "di") {
|
79 |
|
|
if (e.children(0).innerText.indexOf("\n") > 0)
|
80 |
|
|
fix(e, "db");
|
81 |
|
|
}
|
82 |
|
|
|
83 |
|
|
// remove the id since we only used it for cleanup
|
84 |
|
|
e.id = "";
|
85 |
|
|
}
|
86 |
|
|
|
87 |
|
|
// Fix up the element as a "block" display and enable expand/collapse on it
|
88 |
|
|
function fix(e, cl)
|
89 |
|
|
{
|
90 |
|
|
// change the class name and display value
|
91 |
|
|
e.className = cl;
|
92 |
|
|
e.style.display = "block";
|
93 |
|
|
|
94 |
|
|
// mark the comment or cdata display as a expandable container
|
95 |
|
|
j = e.parentElement.children(0);
|
96 |
|
|
j.className = "c";
|
97 |
|
|
|
98 |
|
|
// find the +/- symbol and make it visible - the dummy link enables tabbing
|
99 |
|
|
k = j.children(0);
|
100 |
|
|
k.style.visibility = "visible";
|
101 |
|
|
k.href = "#";
|
102 |
|
|
}
|
103 |
|
|
|
104 |
|
|
// Change the +/- symbol and hide the children. This function works on "element"
|
105 |
|
|
// displays
|
106 |
|
|
function ch(e)
|
107 |
|
|
{
|
108 |
|
|
// find the +/- symbol
|
109 |
|
|
mark = e.children(0).children(0);
|
110 |
|
|
|
111 |
|
|
// if it is already collapsed, expand it by showing the children
|
112 |
|
|
if (mark.innerText == "+")
|
113 |
|
|
{
|
114 |
|
|
mark.innerText = "-";
|
115 |
|
|
for (var i = 1; i < e.children.length; i++)
|
116 |
|
|
e.children(i).style.display = "block";
|
117 |
|
|
}
|
118 |
|
|
|
119 |
|
|
// if it is expanded, collapse it by hiding the children
|
120 |
|
|
else if (mark.innerText == "-")
|
121 |
|
|
{
|
122 |
|
|
mark.innerText = "+";
|
123 |
|
|
for (var i = 1; i < e.children.length; i++)
|
124 |
|
|
e.children(i).style.display="none";
|
125 |
|
|
}
|
126 |
|
|
}
|
127 |
|
|
|
128 |
|
|
// Change the +/- symbol and hide the children. This function work on "comment"
|
129 |
|
|
// and "cdata" displays
|
130 |
|
|
function ch2(e)
|
131 |
|
|
{
|
132 |
|
|
// find the +/- symbol, and the "PRE" element that contains the content
|
133 |
|
|
mark = e.children(0).children(0);
|
134 |
|
|
contents = e.children(1);
|
135 |
|
|
|
136 |
|
|
// if it is already collapsed, expand it by showing the children
|
137 |
|
|
if (mark.innerText == "+")
|
138 |
|
|
{
|
139 |
|
|
mark.innerText = "-";
|
140 |
|
|
// restore the correct "block"/"inline" display type to the PRE
|
141 |
|
|
if (contents.className == "db" || contents.className == "cb")
|
142 |
|
|
contents.style.display = "block";
|
143 |
|
|
else contents.style.display = "inline";
|
144 |
|
|
}
|
145 |
|
|
|
146 |
|
|
// if it is expanded, collapse it by hiding the children
|
147 |
|
|
else if (mark.innerText == "-")
|
148 |
|
|
{
|
149 |
|
|
mark.innerText = "+";
|
150 |
|
|
contents.style.display = "none";
|
151 |
|
|
}
|
152 |
|
|
}
|
153 |
|
|
|
154 |
|
|
// Handle a mouse click
|
155 |
|
|
function cl()
|
156 |
|
|
{
|
157 |
|
|
e = window.event.srcElement;
|
158 |
|
|
|
159 |
|
|
// make sure we are handling clicks upon expandable container elements
|
160 |
|
|
if (e.className != "c")
|
161 |
|
|
{
|
162 |
|
|
e = e.parentElement;
|
163 |
|
|
if (e.className != "c")
|
164 |
|
|
{
|
165 |
|
|
return;
|
166 |
|
|
}
|
167 |
|
|
}
|
168 |
|
|
e = e.parentElement;
|
169 |
|
|
|
170 |
|
|
// call the correct funtion to change the collapse/expand state and display
|
171 |
|
|
if (e.className == "e")
|
172 |
|
|
ch(e);
|
173 |
|
|
if (e.className == "k")
|
174 |
|
|
ch2(e);
|
175 |
|
|
}
|
176 |
|
|
|
177 |
|
|
// Dummy function for expand/collapse link navigation - trap onclick events instead
|
178 |
|
|
function ex()
|
179 |
|
|
{}
|
180 |
|
|
|
181 |
|
|
// Erase bogus link info from the status window
|
182 |
|
|
function h()
|
183 |
|
|
{
|
184 |
|
|
window.status=" ";
|
185 |
|
|
}
|
186 |
|
|
|
187 |
|
|
// Set the onclick handler
|
188 |
|
|
document.onclick = cl;
|
189 |
|
|
|
190 |
|
|
]]></xsl:comment></SCRIPT>
|
191 |
|
|
</HEAD>
|
192 |
|
|
|
193 |
|
|
<BODY class="st"><xsl:apply-templates/></BODY>
|
194 |
|
|
|
195 |
|
|
</HTML>
|
196 |
|
|
</xsl:template>
|
197 |
|
|
|
198 |
|
|
<!-- Templates for each node type follows. The output of each template has a similar structure
|
199 |
|
|
to enable script to walk the result tree easily for handling user interaction. -->
|
200 |
|
|
|
201 |
|
|
<!-- Template for the DOCTYPE declaration. No way to get the DOCTYPE, so we just put in a placeholder -->
|
202 |
|
|
<!--
|
203 |
|
|
<xsl:template match="node()[nodeType()=10]">
|
204 |
|
|
<DIV class="e"><SPAN>
|
205 |
|
|
<SPAN class="b"><xsl:entity-ref name="nbsp"/></SPAN>
|
206 |
|
|
<SPAN class="d"><!DOCTYPE <xsl:node-name/><I> (View Source for full doctype...)</I>></SPAN>
|
207 |
|
|
</SPAN></DIV>
|
208 |
|
|
</xsl:template>
|
209 |
|
|
-->
|
210 |
|
|
<!-- Template for pis not handled elsewhere -->
|
211 |
|
|
<!--
|
212 |
|
|
<xsl:template match="pi()">
|
213 |
|
|
<DIV class="e">
|
214 |
|
|
<SPAN class="b"><xsl:entity-ref name="nbsp"/></SPAN>
|
215 |
|
|
<SPAN class="m"><?</SPAN><SPAN class="pi"><xsl:node-name/> <xsl:value-of/></SPAN><SPAN class="m">?></SPAN>
|
216 |
|
|
</DIV>
|
217 |
|
|
</xsl:template>
|
218 |
|
|
|
219 |
|
|
-->
|
220 |
|
|
<!-- Template for the XML declaration. Need a separate template because the pseudo-attributes
|
221 |
|
|
are actually exposed as attributes instead of just element content, as in other pis -->
|
222 |
|
|
<!--
|
223 |
|
|
<xsl:template match="pi('xml')">
|
224 |
|
|
<DIV class="e">
|
225 |
|
|
<SPAN class="b"><xsl:entity-ref name="nbsp"/></SPAN>
|
226 |
|
|
<SPAN class="m"><?</SPAN><SPAN class="pi">xml <xsl:for-each select="@*"><xsl:node-name/>="<xsl:value-of/>" </xsl:for-each></SPAN><SPAN class="m">?></SPAN>
|
227 |
|
|
</DIV>
|
228 |
|
|
</xsl:template>
|
229 |
|
|
-->
|
230 |
|
|
<!-- Template for attributes not handled elsewhere -->
|
231 |
|
|
<xsl:template match="@*" xml:space="preserve"><SPAN><xsl:attribute name="class"><xsl:if match="xsl:*/@*">x</xsl:if>t</xsl:attribute> <xsl:node-name/></SPAN><SPAN class="m">="</SPAN><B><xsl:value-of/></B><SPAN class="m">"</SPAN></xsl:template>
|
232 |
|
|
|
233 |
|
|
<!-- Template for attributes in the xmlns or xml namespace -->
|
234 |
|
|
<xsl:template match="@xmlns:*|@xmlns|@xml:*"><SPAN class="ns"> <xsl:node-name/></SPAN><SPAN class="m">="</SPAN><B class="ns"><xsl:value-of/></B><SPAN class="m">"</SPAN></xsl:template>
|
235 |
|
|
|
236 |
|
|
<!-- Template for attributes in the dt namespace -->
|
237 |
|
|
<xsl:template match="@dt:*|@d2:*"><SPAN class="dt"> <xsl:node-name/></SPAN><SPAN class="m">="</SPAN><B class="dt"><xsl:value-of/></B><SPAN class="m">"</SPAN></xsl:template>
|
238 |
|
|
|
239 |
|
|
<!-- Template for text nodes -->
|
240 |
|
|
<xsl:template match="textNode()">
|
241 |
|
|
<DIV class="e">
|
242 |
|
|
<SPAN class="b"><xsl:entity-ref name="nbsp"/></SPAN>
|
243 |
|
|
<SPAN class="tx"><xsl:value-of/></SPAN>
|
244 |
|
|
</DIV>
|
245 |
|
|
</xsl:template>
|
246 |
|
|
|
247 |
|
|
|
248 |
|
|
<!-- Note that in the following templates for comments and cdata, by default we apply a style
|
249 |
|
|
appropriate for single line content (e.g. non-expandable, single line display). But we also
|
250 |
|
|
inject the attribute 'id="clean"' and a script call 'f(clean)'. As the output is read by the
|
251 |
|
|
browser, it executes the function immediately. The function checks to see if the comment or
|
252 |
|
|
cdata has multi-line data, in which case it changes the style to a expandable, multi-line
|
253 |
|
|
display. Performing this switch in the DHTML instead of from script in the XSL increases
|
254 |
|
|
the performance of the style sheet, especially in the browser's asynchronous case -->
|
255 |
|
|
|
256 |
|
|
<!-- Template for comment nodes -->
|
257 |
|
|
<xsl:template match="comment()">
|
258 |
|
|
<DIV class="k">
|
259 |
|
|
<SPAN><A class="b" onclick="return false" onfocus="h()" STYLE="visibility:hidden">-</A> <SPAN class="m"><!--</SPAN></SPAN>
|
260 |
|
|
<SPAN id="clean" class="ci"><PRE><xsl:value-of/></PRE></SPAN>
|
261 |
|
|
<SPAN class="b"><xsl:entity-ref name="nbsp"/></SPAN> <SPAN class="m">--></SPAN>
|
262 |
|
|
<SCRIPT>f(clean);</SCRIPT></DIV>
|
263 |
|
|
</xsl:template>
|
264 |
|
|
|
265 |
|
|
<!-- Template for cdata nodes -->
|
266 |
|
|
<xsl:template match="cdata()">
|
267 |
|
|
<DIV class="k">
|
268 |
|
|
<SPAN><A class="b" onclick="return false" onfocus="h()" STYLE="visibility:hidden">-</A> <SPAN class="m"><![CDATA[</SPAN></SPAN>
|
269 |
|
|
<SPAN id="clean" class="di"><PRE><xsl:value-of/></PRE></SPAN>
|
270 |
|
|
<SPAN class="b"><xsl:entity-ref name="nbsp"/></SPAN> <SPAN class="m">]]></SPAN>
|
271 |
|
|
<SCRIPT>f(clean);</SCRIPT></DIV>
|
272 |
|
|
</xsl:template>
|
273 |
|
|
|
274 |
|
|
|
275 |
|
|
<!-- Note the following templates for elements may examine children. This harms to some extent
|
276 |
|
|
the ability to process a document asynchronously - we can't process an element until we have
|
277 |
|
|
read and examined at least some of its children. Specifically, the first element child must
|
278 |
|
|
be read before any template can be chosen. And any element that does not have element
|
279 |
|
|
children must be read completely before the correct template can be chosen. This seems
|
280 |
|
|
an acceptable performance loss in the light of the formatting possibilities available
|
281 |
|
|
when examining children. -->
|
282 |
|
|
|
283 |
|
|
<!-- Template for elements not handled elsewhere (leaf nodes) -->
|
284 |
|
|
<xsl:template match="*">
|
285 |
|
|
<DIV class="e"><DIV STYLE="margin-left:1em;text-indent:-2em">
|
286 |
|
|
<SPAN class="b"><xsl:entity-ref name="nbsp"/></SPAN>
|
287 |
|
|
<SPAN class="m"><</SPAN><SPAN><xsl:attribute name="class"><xsl:if match="xsl:*">x</xsl:if>t</xsl:attribute><xsl:node-name/></SPAN> <xsl:apply-templates select="@*"/><SPAN class="m"> /></SPAN>
|
288 |
|
|
</DIV></DIV>
|
289 |
|
|
</xsl:template>
|
290 |
|
|
|
291 |
|
|
<!-- Template for elements with comment, pi and/or cdata children -->
|
292 |
|
|
<xsl:template match="*[node()]">
|
293 |
|
|
<DIV class="e">
|
294 |
|
|
<DIV class="c"><A href="#" onclick="return false" onfocus="h()" class="b">-</A> <SPAN class="m"><</SPAN><SPAN><xsl:attribute name="class"><xsl:if match="xsl:*">x</xsl:if>t</xsl:attribute><xsl:node-name/></SPAN><xsl:apply-templates select="@*"/> <SPAN class="m">></SPAN></DIV>
|
295 |
|
|
<DIV><xsl:apply-templates/>
|
296 |
|
|
<DIV><SPAN class="b"><xsl:entity-ref name="nbsp"/></SPAN> <SPAN class="m"></</SPAN><SPAN><xsl:attribute name="class"><xsl:if match="xsl:*">x</xsl:if>t</xsl:attribute><xsl:node-name/></SPAN><SPAN class="m">></SPAN></DIV>
|
297 |
|
|
</DIV></DIV>
|
298 |
|
|
</xsl:template>
|
299 |
|
|
|
300 |
|
|
<!-- Template for elements with only text children -->
|
301 |
|
|
<xsl:template match="*[textNode()$and$$not$(comment()$or$pi()$or$cdata())]">
|
302 |
|
|
<DIV class="e"><DIV STYLE="margin-left:1em;text-indent:-2em">
|
303 |
|
|
<SPAN class="b"><xsl:entity-ref name="nbsp"/></SPAN> <SPAN class="m"><</SPAN><SPAN><xsl:attribute name="class"><xsl:if match="xsl:*">x</xsl:if>t</xsl:attribute><xsl:node-name/></SPAN><xsl:apply-templates select="@*"/>
|
304 |
|
|
<SPAN class="m">></SPAN><SPAN class="tx"><xsl:value-of/></SPAN><SPAN class="m"></</SPAN><SPAN><xsl:attribute name="class"><xsl:if match="xsl:*">x</xsl:if>t</xsl:attribute><xsl:node-name/></SPAN><SPAN class="m">></SPAN>
|
305 |
|
|
</DIV></DIV>
|
306 |
|
|
</xsl:template>
|
307 |
|
|
|
308 |
|
|
<!-- Template for elements with element children -->
|
309 |
|
|
<xsl:template match="*[*]">
|
310 |
|
|
<DIV class="e">
|
311 |
|
|
<DIV class="c" STYLE="margin-left:1em;text-indent:-2em"><A href="#" onclick="return false" onfocus="h()" class="b">-</A> <SPAN class="m"><</SPAN><SPAN><xsl:attribute name="class"><xsl:if match="xsl:*">x</xsl:if>t</xsl:attribute><xsl:node-name/></SPAN><xsl:apply-templates select="@*"/> <SPAN class="m">></SPAN></DIV>
|
312 |
|
|
<DIV><xsl:apply-templates/>
|
313 |
|
|
<DIV><SPAN class="b"><xsl:entity-ref name="nbsp"/></SPAN> <SPAN class="m"></</SPAN><SPAN><xsl:attribute name="class"><xsl:if match="xsl:*">x</xsl:if>t</xsl:attribute><xsl:node-name/></SPAN><SPAN class="m">></SPAN></DIV>
|
314 |
|
|
</DIV></DIV>
|
315 |
|
|
</xsl:template>
|
316 |
|
|
|
317 |
|
|
</xsl:stylesheet>
|