我是xsl模板的新手,但我还没有找到一种方法可以做我想要的。看来这应该是可能的。
我想要的是为一个xml文件提供多个模板。我正在做一个在线简历,所以我有我的resume.xml文件。我想有我的onlineResume.xsl模板,我的downloadWord.xsl模板和我的downloadPDF.xsl模板。将根据主网页上选择的选项卡呈现这三个模板。
现在我有以下测试。显然,身体并没有充实,但我无法通过链接多个样式表,具体取决于所遵循的链接。我打开php,javascript / jquery,xsl,xml,xpath或其他任何需要的东西。我的网站是用php开发的服务器端。
HTML主页
<html>
<head></head>
<body>
<a href="./resume.xml">Online Resume</a>
<a href="./resume.xml">Download Word</a>
<a href="./resume.xml">Download PDF</a>
</body>
</html>
XML
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="onlineCV.xsl"?>
<resume>
<personal_info>
<birthdate>07/08/1988</birthdate>
</personal_info>
<jobs>
<job>
<company>Radio Shack</company>
<title>Sales Representative</title>
<startdate>01/01/2011</startdate>
<enddate>02/02/2011</enddate>
<duration>1.5yrs</duration>
<sortdate>20110101</sortdate>
</job>
<job>
<company>Radio Shack2</company>
<title>Sales Representative</title>
<startdate>01/01/2013</startdate>
<enddate>02/02/2013</enddate>
<duration>1.5yrs</duration>
<sortdate>20130202</sortdate>
</job>
</jobs>
</resume>
在线简历
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My Resume</h2>
<xsl:for-each select="resume/jobs/job">
<xsl:sort select="sortdate" data-type="number" order="descending" />
<div>
<xsl:value-of select="company" /> - <xsl:value-of select="title"/>
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
下载Word
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My Word Download</h2>
<xsl:for-each select="resume/jobs/job">
<xsl:sort select="sortdate" data-type="number" order="descending" />
<div>
<xsl:value-of select="company" /> - <xsl:value-of select="title"/>
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
下载PDF
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My PDF Download</h2>
<xsl:for-each select="resume/jobs/job">
<xsl:sort select="sortdate" data-type="number" order="descending" />
<div>
<xsl:value-of select="company" /> - <xsl:value-of select="title"/>
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
您确实可以使用不同的XSLT模板从XML生成不同的输出。但是,您不生成不同的输出,您将一个输出发送到浏览器并进行转换。
想一想。目前,这里没有决定应该使用哪个模板的值/指标。
您有两种可能性:
$xsltFile = 'onlineCV.xsl';
$xmlDom = new DOMDocument();
$xmlDom->loadXml($xml);
$xslDom = new DOMDocument();
$xslDOM->load($xsltFile);
$processor = new XsltProcessor();
$processor->importStylesheet($xslDom);
echo $processor->transformToXml($xmlDom);
这将根据XSLT生成并输出并输出。
生成不同的XML输出,引用不同的XSLT模板并将它们发送到浏览器
$xsltFile = 'onlineCV.xsl';
$dom = new DOMDocument();
$dom->loadXml($xml);
$dom->insertBefore(
$dom->createProcessingInstruction(
'xml-stylesheet',
'type="text/xsl" href="'.$xsltFile.'"'
),
$dom->documentElement
);
echo $dom->saveXml();