Javascript 将多个xsl模板与一个xml一起使用
我不熟悉xsl模板,但我还没有找到一种方法来实现我想要的。看来这应该是可能的 我想要的是为一个xml文件提供多个模板。我正在做一份在线简历,所以我有我的resume.xml文件。我想要我的onlinesume.xsl模板、downloadWord.xsl模板和downloadPDF.xsl模板。这三个模板将根据主网页上选择的选项卡呈现 现在我有下面的测试。很明显,主体并没有充实,但我无法通过链接多个样式表,这取决于所遵循的链接。我对php、javascript/jquery、xsl、xml、xpath或任何需要的东西都持开放态度。我的网站是用php在服务器端开发的 HTML主页Javascript 将多个xsl模板与一个xml一起使用,javascript,php,html,xml,xslt,Javascript,Php,Html,Xml,Xslt,我不熟悉xsl模板,但我还没有找到一种方法来实现我想要的。看来这应该是可能的 我想要的是为一个xml文件提供多个模板。我正在做一份在线简历,所以我有我的resume.xml文件。我想要我的onlinesume.xsl模板、downloadWord.xsl模板和downloadPDF.xsl模板。这三个模板将根据主网页上选择的选项卡呈现 现在我有下面的测试。很明显,主体并没有充实,但我无法通过链接多个样式表,这取决于所遵循的链接。我对php、javascript/jquery、xsl、xml、xp
<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
07/08/1988
无线电小屋
销售代表
01/01/2011
02/02/2011
1.5年
20110101
无线电震动2
销售代表
01/01/2013
02/02/2013
1.5年
20130202
网上简历
<?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>
我的简历
-
下载文字
<?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>
我的PDF下载
-
您确实可以使用不同的XSLT模板从XML生成不同的输出。但您不会生成不同的输出,而是将一个输出发送到浏览器,然后浏览器会对其进行转换
想想看。目前,这里没有决定应使用哪个模板的值/指标
你有两种可能:
使用XSLTProcessor(PHP)的服务器端处理
这将根据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();
演示:就最佳实践而言,这些方法中的一种效果最好,还是使用include for the xml效果最好(在链接中概述)。昨晚我做了一些调查,发现了一个可能性。浏览器似乎无法解析外部实体,因此在模板中使用包装器XML并将主XML包含为实体将不起作用。是的,我刚刚测试了该工具,模板无法识别实体中的元素。假设我将使用PHP。谢谢你的帮助。
$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);
$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();