我正在寻找将XSL嵌入到XML中的解决方案,因此只有1个XML文件被发送到浏览器。我尝试了Dimitre Novatchev提出的解决方案:Embed xsl into an XML file
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes"/> <xsl:variable name="vEmbDoc">
<doc>
<head></head>
<body>
<para id="foo">Hello I am foo</para>
</body>
</doc>
</xsl:variable>
<xsl:template match="para">
<h1><xsl:value-of select="."/></h1>
</xsl:template>
<xsl:template match="xsl:template"/></xsl:stylesheet>
问题是,通过这个解决方案,我找不到在头部中包含样式元素的方法。似乎在提议的解决方案中头部和身体标签没有任何影响,因为浏览器将在解析过程中自动添加它们,并且解决方案即使没有包含这些标签也能正常工作。
所以问题是:如何在上面提到的解决方案中包含样式元素,如下所示:
<head><style>body {font-size:10pt;padding:20pt} </style></head>
答案 0 :(得分:1)
此XML文档:
<?xml-stylesheet type="text/xsl" href="myEmbedded.xml"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl">
<xsl:output omit-xml-declaration="yes"/>
<xsl:variable name="vEmbDoc">
<doc>
<head>
<style>body {font-size:10pt;padding:20pt}</style>
</head>
<body>
<para id="foo">Hello I am foo</para>
</body>
</doc>
</xsl:variable>
<xsl:template match="para">
<h1><xsl:value-of select="."/></h1>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="doc">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="xsl:template"/>
<xsl:template match="xsl:*">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
包含一个XSLT样式表。起始PI指示浏览器将此样式表应用于自身。
如此指定的转换产生想要的结果:
<html>
<head xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>body {font-size:10pt;padding:20pt}</style>
</head>
<body xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<h1>Hello I am foo</h1>
</body>
</html>