将XSLT作为HTML的样式表的如何使用方法示例

房子修得再大也是临时住所,只有那个小木匣才是永久的家,所以,屋宽不如心宽,身安不如心安!

简介  

当听到样式表这个词时,您可能会想到 CSS 样式表。XSLT 样式表通常用于 XML 转换,比如在 Web 服务之间映射数据。因为 XSLT 非常适合此用途,所以创建了顶层元素 <stylesheet> 的 <xsl:transform> 别名,虽然这很少使用。这种 XSLT 转换的输入结构与输出结构有很大的不同。最重要的是,命名空间的不同。

  XSLT 样式表的输入结构与输出结构相似,但却更简单些。其中已经扩充了一些标记,但大部分标记只是原样复制到输出。输入和输出的命名空间是相同的 (HTML)。输入文档也可以包含样式表指令(比如创建脚注),这些指令属于另一个命名空间,不会传递到输出中。
常用缩略语

CSS:级联样式表
XHTML:可扩展超文本标记语言
XPath:XML 路径语言
XSLT:可扩展样式表语言转换

  在本文中,我们将学习如何使用 XSLT 样式表扩充 XHTML 文档。文中的示例展示了如何使用指令,如何引用其他源文档的部分,以及如何使用链接在主文档中导航。此外,我们还探索了页面的解释和编译之间的区别。
CSS 样式表的局限性

  XSLT 样式表不会阻止您使用其他技术,比如 JavaScript 或 CSS。CSS 适用于字体、加粗、颜色、间距等。它不适合将来自不同位置的信息组合在一起,比如脚注、模块或生成一个目录。这正是 XSLT 的用武之地,它补充而不是替代了 CSS。
XSLT 用途示例

  实际上,您可以将 XSLT 代码集中在一个文件中。为了简单起见,本文中的每个示例均位于一个独立的 XSLT 文件中,除了一些必要的代码。清单 1 给出了必需的代码。

  清单 1. 必需的代码(位于 samples/common.xml 中)


XML/HTML Code复制内容到剪贴板
  1. <s:stylesheet
  2. <spanstyle="width:auto;height:auto;float:none;"id="24_nwp"><astyle="text-decoration:none;"mpid="24"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=xml&k0=xml&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="24_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">xml</span></a></span>ns="http://www.w3.org/1999/xhtml"
  3. xmlns:h="http://www.w3.org/1999/xhtml"
  4. xmlns:a="http://sourceforge.net/projects/arbalo/"
  5. xmlns:s="http://www.w3.org/1999/XSL/Transform"
  6. exclude-result-prefixes="ah"
  7. version="1.0"
  8. >
  9. <s:templatematch="h:<spanstyle="width:auto;height:auto;float:none;"id="25_nwp"><astyle="text-decoration:none;"mpid="25"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=head&k0=head&kdi0=0&luki=9&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="25_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head</span></a></span>">
  10. <s:copy>
  11. <s:apply-templatesselect="@*|node()"/>
  12. <meta
  13. http-equiv="content-type"
  14. content="text/html;charset=UTF-8"/>
  15. <link
  16. rel="nofollow noopener noreferrer" href="common.<spanstyle="width:auto;height:auto;float:none;"id="26_nwp"><astyle="text-decoration:none;"mpid="26"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=css&k0=css&kdi0=0&luki=8&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="26_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">css</span></a></span>"
  17. rel="stylesheet"
  18. type="text/css"/>
  19. </s:copy>
  20. </s:template>
  21. <s:templatematch="*">
  22. <s:copy>
  23. <s:copy-ofselect="@*"/>
  24. <s:apply-templates/>
  25. </s:copy>
  26. </s:template>
  27. </s:stylesheet>

  XHTML 的命名空间定义了两次:默认定义和 h:。默认命名空间用于编写输出 XHTML 标记,其中应该避免使用命名空间前缀。h: 用在 XPath 表达式中。

  本文使用 XSLT 1.0 版本。目前,大部分浏览器都无法解释 XSLT 2.0。但是,如果 XSLT 运行在服务器上,那么它可能是一个实用的选择。XSLT 2.0 还提供了:

XPATH 2.0(if…then…else 和许多内置的函数)
内置和用户编写的 XPATH 函数
分组

  在 清单 1 中:

s:template match="head" 扩充了源文档的 head 一节,添加了一个 CSS 样式表的链接。即使 UTF-8 是在 XML 中的默认编码,一些浏览器也需要内容类型才能呈现它。
s:template match="*" 是默认的详细副本。原则上,所有内容都会复制到目标文档中。如果遗漏了此模板,只会将标记的文本内容复制到目标文档。不会复制处理指令节点。

  本文中的所有其他示例都是导入 common.xsl 的独立文件。
扩充

  通过扩充,添加了一个未在源文档中显式请求的特性。一个示例是 清单 1 中的 CSS 样式表的链接。尝试另一个示例,向每个内部链接添加一个小箭头 (^ v),指明目标在它之前还是之后。清单 2 给出了该样式表。

  清单 2. 样式表(在 samples/linkUpDown.xsl 中)


XML/HTML Code复制内容到剪贴板
  1. <s:stylesheet
  2. <spanstyle="width:auto;height:auto;float:none;"id="22_nwp"><astyle="text-decoration:none;"mpid="22"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=xml&k0=xml&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="22_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">xml</span></a></span>ns="http://www.w3.org/1999/xhtml"
  3. xmlns:h="http://www.w3.org/1999/xhtml"
  4. xmlns:s="http://www.w3.org/1999/XSL/Transform"
  5. version="1.0"
  6. >
  7. <s:importrel="nofollow noopener noreferrer" href="common.xsl"/>
  8. <s:templatematch="h:a[starts-with(@href,'#')]">
  9. <s:copy>
  10. <s:copy-ofselect="@*"/>
  11. <s:variablename="name"select="substring-after(@href,'#')"/>
  12. <s:choose>
  13. <s:whentest="preceding::h:a[@name=$name]">
  14. <s:text>^</s:text>
  15. </s:when>
  16. <s:whentest="following::h:a[@name=$name]">
  17. <s:text>v</s:text>
  18. </s:when>
  19. </s:choose>
  20. <s:apply-templates/>
  21. </s:copy>
  22. </s:template>
  23. </s:stylesheet>

  首先,导入清单 2 中的通用样式表。模板与内部链接(以 '#' 开头)相匹配。如果链接指向的锚点位于链接之前,那么使用一个向上箭头扩充该链接(如果情况相反,则使用向下箭头)。

  s:copy-of 和 s:apply-templates 可确保不会沿途丢下任何内容。

  清单 3 给出了一个示例文档(其中包含内部链接),它经过了清单 2 中的样式表进行扩充。

  清单 3. 源文档(在 samples/linkUpDown.xml 中)

XML/HTML Code复制内容到剪贴板
  1. <?<spanstyle="width:auto;height:auto;float:none;"id="20_nwp"><astyle="text-decoration:none;"mpid="20"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=xml&k0=xml&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="20_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">xml</span></a></span>-stylesheetrel="nofollow noopener noreferrer" href="linkUpDown.xsl"type="text/xsl"?>
  2. <htmlxmlns="http://www.w3.org/1999/xhtml">
  3. <<spanstyle="width:auto;height:auto;float:none;"id="21_nwp"><astyle="text-decoration:none;"mpid="21"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=head&k0=head&kdi0=0&luki=9&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="21_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head</span></a></span>/>
  4. <body>
  5. <aname="a"/>
  6. <p>Thislinkgoes<arel="nofollow noopener noreferrer" href="vb">downward.</a></p>
  7. <br/>
  8. <p>Reducethesizeofthewindowtoverifythelinkreallyworks.</p>
  9. <br/>
  10. <aname="b"/>
  11. <p>Thislinkgoes<arel="nofollow noopener noreferrer" href="^a">upward.</a>
  12. </p>
  13. </body>
  14. </html>

  目标文档看起来相同,除了清单 4 中的条目。
  清单 4. 目标文档(在 samples/linkUpDown.html 中)

XML/HTML Code复制内容到剪贴板
  1. …<arel="nofollow noopener noreferrer" href="#b">vdownwards.</a>…
  2. …<arel="nofollow noopener noreferrer" href="#a">^upwards.</a>…

指令

  您可以在源文档中添加一些指令,告诉样式表执行何种操作。它们属于另一个命名空间(在本例中为前缀 a:),不会被复制到目标文档。

  在清单 5 中,源文档中任何地方的指令标记 a:ref 都会创建一个脚注。

  清单 5. 样式表(在 samples/footnote.xsl 中)

XML/HTML Code复制内容到剪贴板
  1. <s:stylesheet
  2. <spanstyle="width:auto;height:auto;float:none;"id="19_nwp"><astyle="text-decoration:none;"mpid="19"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=xml&k0=xml&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="19_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">xml</span></a></span>ns="http://www.w3.org/1999/xhtml"
  3. xmlns:a="http://sourceforge.net/projects/arbalo/"
  4. xmlns:h="http://www.w3.org/1999/xhtml"
  5. xmlns:s="http://www.w3.org/1999/XSL/Transform"
  6. version="1.0"
  7. >
  8. <s:importrel="nofollow noopener noreferrer" href="common.xsl"/>
  9. <s:templatematch="h:body">
  10. <s:copy>
  11. <s:apply-templatesselect="@*|node()"/
  12. <!--putthefootnotesattheend
  13. ifthereisnoa:referencesdirective-->
  14. <s:iftest="not(descendant::a:references)">
  15. <s:call-templatename="references"/>
  16. </s:if>
  17. </s:copy>
  18. </s:template>
  19. <!--Createafootnote-->
  20. <s:templatematch="a:ref">
  21. <s:variable
  22. name="number"
  23. select="count(preceding::a:ref)+1"/>
  24. <aname="ref-{$number}"></a>
  25. <aclass="footnote"rel="nofollow noopener noreferrer" href="#reference-{$number}">
  26. <s:value-ofselect="concat('v',$number)"/>
  27. </a>
  28. </s:template>
  29. <!--ifa:referenceismissing,assumeitattheendofthebody-->
  30. <s:templatematch="a:references"name="references">
  31. <hr/>
  32. <s:for-eachselect="//a:ref">
  33. <s:variablename="number"select="count(preceding::a:ref)+1"/>
  34. <p>
  35. <aname="reference-{$number}"></a>
  36. <aclass="footnote"rel="nofollow noopener noreferrer" href="#ref-{$number}">
  37. <s:value-ofselect="concat('^',$number)"/>
  38. </a>
  39. <s:apply-templates/>
  40. </p>
  41. </s:for-each>
  42. </s:template>
  43. </s:stylesheet>

  使用源文档中的 a:references 指令,名为 references 的模板会在模板与该指令匹配的地方分配脚注。如果缺少这样一个指令,第一个与 body 匹配的模板会在 body 的末尾分配脚注,方法是调用名为 references 的相同模板。在两种情况下,都会列出脚注的内容,并生成一个由向上箭头表示的向上链接。

  第二个模板(匹配 a:ref)使用向下箭头创建脚注的链接。脚注具有编号。这里忽略了它的内容。

  class="footnote" 属性在 XSLT 转换之后由一个 CSS 样式表解析,该样式表链接在 XSLT 样式表 common.xsl 中。

  清单 6 中的源文档使用 a:ref 指令创建脚注。

  清单 6. 源文档(在 samples/footnote.xml 中)

XML/HTML Code复制内容到剪贴板
  1. <?<spanstyle="width:auto;height:auto;float:none;"id="17_nwp"><astyle="text-decoration:none;"mpid="17"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=xml&k0=xml&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="17_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">xml</span></a></span>-stylesheetrel="nofollow noopener noreferrer" href="footnote.xsl"type="text/xsl"?>
  2. <html
  3. xmlns="http://www.w3.org/1999/xhtml"
  4. xmlns:a="http://sourceforge.net/projects/arbalo/"
  5. >
  6. <<spanstyle="width:auto;height:auto;float:none;"id="18_nwp"><astyle="text-decoration:none;"mpid="18"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=head&k0=head&kdi0=0&luki=9&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="18_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head</span></a></span>/>
  7. <body>
  8. <p>
  9. Thisexamplelooksalittlescientific
  10. <a:ref>
  11. FromLatin
  12. <em>scientia</em>
  13. </a:ref>
  14. andacademic
  15. <a:ref>FromGreekakademia</a:ref>.
  16. </p>
  17. <p>
  18. Doyouknowwhy?
  19. <a:ref>
  20. Ituses
  21. <em>footnotes</em>.
  22. </a:ref>
  23. </p>
  24. <p>Reducesizeofwindowtoverifylinksaregenerated.</p>
  25. </body>
  26. </html>

  目标文档将脚注列表包含在底部,如清单 7 所示。

  清单 7. 目标文档(在 samples/footnote.html 中)


XML/HTML Code复制内容到剪贴板
  1. <html
  2. <spanstyle="width:auto;height:auto;float:none;"id="14_nwp"><astyle="text-decoration:none;"mpid="14"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=xml&k0=xml&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="14_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">xml</span></a></span>ns="http://www.w3.org/1999/xhtml"
  3. xmlns:h="http://www.w3.org/1999/xhtml"
  4. xmlns:a="http://sourceforge.net/projects/arbalo/">
  5. <<spanstyle="width:auto;height:auto;float:none;"id="15_nwp"><astyle="text-decoration:none;"mpid="15"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=head&k0=head&kdi0=0&luki=9&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="15_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head</span></a></span>><linktype="text/<spanstyle="width:auto;height:auto;float:none;"id="16_nwp"><astyle="text-decoration:none;"mpid="16"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=css&k0=css&kdi0=0&luki=8&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="16_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">css</span></a></span>"rel="stylesheet"rel="nofollow noopener noreferrer" href="common.css"/></head>
  6. <body>
  7. <p>Thisexamplelooksalittlescientific
  8. <aname="ref-1"/><arel="nofollow noopener noreferrer" href="#reference-1"class="footnote">v1</a>
  9. andacademic.
  10. <aname="ref-2"/><arel="nofollow noopener noreferrer" href="#reference-2"class="footnote">v2lt;/a>
  11. </p>
  12. <p>Doyouknowwhy?
  13. <aname="ref-3"/><arel="nofollow noopener noreferrer" href="#reference-3"class="footnote">v3</a>
  14. </p>
  15. <p>Reducesizeofwindowtoverifylinksaregenerated.</p>
  16. br/><br/>
  17. <hr/>
  18. <p><aname="reference-1"/><arel="nofollow noopener noreferrer" href="#ref-1"class="footnote">^1</a>
  19. FromLatin
  20. <em>scientia</em>
  21. </p>
  22. <p><aname="reference-2"/>
  23. <arel="nofollow noopener noreferrer" href="#ref-2"class="footnote">^2</a>FromGreekakademia</p>
  24. <p><aname="reference-3"/><arel="nofollow noopener noreferrer" href="#ref-3"class="footnote">^3</a>
  25. Ituses
  26. <em>footnotes</em>.
  27. </p>
  28. </body>
  29. </html>

突破源文档的边界

  也可引用其他源文档的其中一些部分。a:include 指令包含一个可能属于另一个源文档的元素并转换它,如清单 8 所示。

  清单 8. 样式表(在 samples/include.xsl 中)


XML/HTML Code复制内容到剪贴板
  1. <s:stylesheet
  2. <spanstyle="width:auto;height:auto;float:none;"id="12_nwp"><astyle="text-decoration:none;"mpid="12"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=xml&k0=xml&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="12_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">xml</span></a></span>ns="http://www.w3.org/1999/xhtml"
  3. xmlns:a="http://sourceforge.net/projects/arbalo/"
  4. xmlns:s="http://www.w3.org/1999/XSL/Transform"
  5. version="1.0"
  6. >
  7. <s:importrel="nofollow noopener noreferrer" href="common.xsl"/>
  8. <s:templatematch="a:include">
  9. <s:choose>
  10. <s:whentest="0!=string-length(@src)">
  11. <s:apply-templates
  12. select="document(@src)//*[@id=current()/@refid]"/>
  13. </s:when>
  14. <s:whentest="not(@<spanstyle="width:auto;height:auto;float:none;"id="13_nwp"><astyle="text-decoration:none;"mpid="13"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=src&k0=src&kdi0=0&luki=7&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="13_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">src</span></a></span>)and//a:default[1]/@src">
  15. <s:apply-templates
  16. select="document(//a:default[1]/@src)//*[@id=current()/@refid]"/>
  17. </s:when>
  18. <s:whentest="0=string-length(@src)ornot(//a:default[1]/@src)">
  19. <s:apply-templates
  20. select="//*[@id=current()/@refid]"/>
  21. </s:when>
  22. </s:choose>
  23. </s:template>
  24. </s:stylesheet>

  源文档中的一个 a:include 指令引用源元素的 id。包含该元素的文档可在一个 src 属性中命名。如果缺少该属性,将使用 a:default 指令的 src 属性。如果在任何地方都没有 src 属性,则使用同一个源文档。因此,refid 会引用 id 来避免无限的递归。

  导入的元素可能具有一种复杂的类型,并在包含 (apply-templates)之后进行转换。清单 9、清单 10 和清单 11 给出了示例。

  清单 9. 源文档(在 samples/include.xml 中)


XML/HTML Code复制内容到剪贴板
  1. <?<spanstyle="width:auto;height:auto;float:none;"id="7_nwp"><astyle="text-decoration:none;"mpid="7"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=xml&k0=xml&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="7_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">xml</span></a></span>-stylesheetrel="nofollow noopener noreferrer" href="include.xsl"type="text/xsl"?>
  2. <html
  3. xmlns="http://www.w3.org/1999/xhtml"
  4. xmlns:a="http://sourceforge.net/projects/arbalo/">
  5. <<spanstyle="width:auto;height:auto;float:none;"id="8_nwp"><astyle="text-decoration:none;"mpid="8"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=head&k0=head&kdi0=0&luki=9&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="8_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head</span></a></span>>
  6. <a:default<spanstyle="width:auto;height:auto;float:none;"id="9_nwp"><astyle="text-decoration:none;"mpid="9"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=src&k0=src&kdi0=0&luki=7&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="9_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">src</span></a></span>="includedY.xml"/>
  7. </head>
  8. <body>
  9. <p>Thefollowingtextisincluded:</p>
  10. <a:includerefid="x"src="includedX.xml"/>
  11. <a:includerefid="y1"/>
  12. <pid="i"><spanstyle="width:auto;height:auto;float:none;"id="10_nwp"><astyle="text-decoration:none;"mpid="10"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=double&k0=double&kdi0=0&luki=6&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="10_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">double</span></a></span></p>
  13. <a:includerefid="y2"/>
  14. <a:includerefid="i"src=""/>
  15. </body>
  16. </html>

  清单 10. 源文档的部分(在 samples/includeY.xml 中)

XML/HTML Code复制内容到剪贴板
  1. <h2id="y2">I'mthe<em>included</em>h2</h2>
  2. <h1id="y1">I'mthe<em>included</em>h1</h1>

  清单 11. 目标文档(在 samples/include.html 中)

XML/HTML Code复制内容到剪贴板
  1. <body>
  2. <p>Thefollowingtextisincluded:</p>
  3. <pid="x">I'mthe<em>included</em>paragraph.</p>
  4. <h1id="y1">I'mthe<em>included</em>h1</h1>
  5. <pid="i"><spanstyle="width:auto;height:auto;float:none;"id="6_nwp"><astyle="text-decoration:none;"mpid="6"target="_blank"rel="nofollow noopener noreferrer" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d14555d819ab7000&k=double&k0=double&kdi0=0&luki=6&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=70ab19d85545d1&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1117%2Ehtml&urlid=0"id="6_nwl"><spanstyle="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">double</span></a></span></p>
  6. <h2id="y2">I'mthe<em>included</em>h2</h2>
  7. <pid="i">double</p>
  8. </body>
  9. </html>

主文档和导航

  如果您有一个包含多个页面的演示,有一个主文档包含页面标题及其链接。您可以生成完整的导航,从每个页面到任何其他页面,以及到前一个和后一个页面。这些细节不属于本文的介绍范围,但 参考资料 中提供了使用主文档的 HTML 演示的链接。可将 .xml 替换为 .html 来获得编译后的版本。让浏览器向您显示 .xml 的整洁源代码。您会对它生成的源代码量感到惊奇。
解释与编译的对比

  解释意味着页面为 XML 格式(其文件扩展名为 .xml,其内容类型为文本/xml 或应用程序/xml),并且处理指令所引用的 XSLT 样式表可在浏览器中执行。

  编译意味着浏览器看到的是 HTML(其文件扩展名为 .html,内容类型为文本/html),它是在请求页面之前从您的开发环境中或服务器上的 XML 转换而来的。Xalan 和 Saxon 都是著名的 XSLT 处理器。

  解释是未来的发展方向。所有现代浏览器都支持 XSLT,并且它具有一些优点:

当测试时,您会立即获得结果。只需在您测试的每个浏览器中按下 F5,即可反映源页面、CSS 和 XSLT 样式表的更改。
要传递给客户端的信息量减少了。
客户端看到的是一个干净、整洁的网页,因为还未生成扩充内容。

  但也要注意一些缺点:

有一些旧浏览器可能不支持 XSLT。如果向一个受控的环境(内部网)发布页面,就不会出现问题。
一些现代浏览器禁止 XSLT 样式表引用另一个目录中的另一个样式表。
将 XSLT 域其他功能相结合(比如 SVG 或 iframe)可能在一些浏览器中导致问题。
因为大部分浏览器都不支持 XSLT 2.0 或即将推出的 3.0,所以您无法使用新功能。没有 XPath 2.0 if () then … else,也没有用户编写的 XPath 功能。

  无论进行编译还是解释,页面的其他转换 (CSS、JavaScript) 都会在 XSLT 转换之后执行。
结束语

  在本文中,您学习了如何使用 XSLT 样式表来扩充 XHTML 文档。您可以使用本文中的示例作为起点,构建您自己的 XSLT 样式表。

文章和XML示例

以上就是将XSLT作为HTML的样式表的如何使用方法示例。工作的质量,决定生活的质量,能力比金钱重要万倍。更多关于将XSLT作为HTML的样式表的如何使用方法示例请关注haodaima.com其它相关文章!

您可能有感兴趣的文章
一篇关于读取style元素定义样式表的兼容问题实例探讨

css好代码教程之样式表的基本语法(二) class(类)和id的一个小实例

HTML默认样式表CSS属性除了inline和block的定义

CSS层叠样式表的层叠是什么意思(自我理解)

CSS布局中如何组织样式表以便于简化、维护