【问题标题】:Using multiple xsl templates with one xml将多个 xsl 模板与一个 xml 一起使用
【发布时间】:2014-06-12 23:45:51
【问题描述】:

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

下载单词

<?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>

【问题讨论】:

    标签: javascript php html xml xslt


    【解决方案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

    【讨论】:

    • 就最佳实践而言,这些方法中的一种是否效果最好,或者使用包含用于 xml 效果最好(链接中概述)。我做了一些挖掘,昨晚深夜发现了一种可能性。 stackoverflow.com/questions/24196139/…
    • 浏览器似乎无法解析外部实体,因此将包装 XML 与模板一起使用并将主要 XML 作为实体包含在内是行不通的。
    • 是的,我刚刚测试了一个,模板无法识别实体中的元素。假设我将使用 PHP。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多