Javascript 将多个xsl模板与一个xml一起使用

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

我不熟悉xsl模板,但我还没有找到一种方法来实现我想要的。看来这应该是可能的

我想要的是为一个xml文件提供多个模板。我正在做一份在线简历,所以我有我的resume.xml文件。我想要我的onlinesume.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


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();