使用多个xsl模板和一个xml

时间:2014-06-12 23:45:52

标签: javascript php html xml xslt

我是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>

1 个答案:

答案 0 :(得分:1)

您确实可以使用不同的XSLT模板从XML生成不同的输出。但是,您不生成不同的输出,您将一个输出发送到浏览器并进行转换。

想一想。目前,这里没有决定应该使用哪个模板的值/指标。

您有两种可能性:

使用XSLTProcessor(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);

这将根据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();

演示:https://eval.in/162137