如何使用XSL为多个网页使用相同的XML源文档

时间:2013-12-09 03:54:34

标签: html xml xslt xslt-1.0

如果我的问题太容易而且不属于此,我很抱歉。我正在进行一项任务,我有一个XML源文档,其中一个样式表声明链接到一个输出为HTML的XSL。现在一切正常,但是这个页面需要是不同页面上的链接。这个其他页面(我假设我将它编码为一个简单的HTML文件)还需要第二个链接,它将使用我已经使用的相同XML源文档中的信息执行一些计算。我想我错过了一些简单的东西,但是如何使用相同的XML创建另一个页面呢?

XML:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="cookies.xsl" ?>
<cookies>
<cookie>
    <brand>Oreo</brand>
    <name>Double Stuff</name>
    <nutritional_info>
        <calories>150</calories>
        <fat>20</fat>
        <sugar>5</sugar>
        <protein>1</protein>
    </nutritional_info>
</cookie>
<cookie>
    <brand>Oreo</brand>
    <name>Golden Oreo</name>
    <nutritional_info>
        <calories>190</calories>
        <fat>7.6</fat>
        <sugar>13.7</sugar>
        <protein>1.5</protein>
    </nutritional_info>
</cookie>
    <cookie>
    <brand>Oreo</brand>
    <name>Sandwich Cookie</name>
    <nutritional_info>
        <calories>140</calories>
        <fat>7.0</fat>
        <sugar>13.0</sugar>
        <protein>1.0</protein>
    </nutritional_info>
</cookie>
<cookie>
    <brand>Archway</brand>
    <name>Dutch Cocoa</name>
    <nutritional_info>
        <calories>110</calories>
        <fat>3.6</fat>
        <sugar>16.0</sugar>
        <protein>1.1</protein>
    </nutritional_info>
</cookie>

XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method ="html" version="4.0" />
<xsl:template match="/">
    <html>
        <head>
            <title>Cookies</title>
            <link href="cookies.css" rel="stylesheet" type="text/css" />
        </head>
        <body>
            <h1 id="header"><img src="header.jpg" alt="cookies" height="150" width="100%"/></h1>
            <h1>Nutritional Info</h1>
            <h2 id="n_info">
                <xsl:apply-templates select="cookies/cookie"/>
            </h2>
        </body>
    </html>
</xsl:template>
<xsl:template match="cookie">
    <h2><xsl:value-of select="@brand"/> <xsl:value-of select="name"/></h2>
    <xsl:for-each select=".">
            <p><img src="{name}.jpg" id="picture"/>                 
            </p>
            <xsl:apply-templates select="nutritional_info"/>
        </xsl:for-each>
</xsl:template>
<xsl:template match="nutritional_info">
    <table border="1" id="info">
        <tr>
            <th>Calories</th>
            <th>Protein</th>
            <th>Total Fat</th>
            <th>Sugar</th>
        </tr>
        <tr>
            <xsl:apply-templates select="calories"/>
            <xsl:apply-templates select="protein"/>
            <xsl:apply-templates select="fat"/>
            <xsl:apply-templates select="sugar"/>
        </tr>
    </table>
</xsl:template>
<xsl:template match="calories|protein|fat|sugar">
    <td><xsl:value-of select="."/></td>
</xsl:template>

我想创建一个链接,使用此样式表打开xml,然后使用另一个链接,它将应用不同的样式和模板,但使用相同XML文件中的相同信息。

1 个答案:

答案 0 :(得分:1)

有几种方法可以实现这一目标:动态输入文件,使用XSLT 2.0功能或只有两个XML文件。

动态输入

如果要动态创建输入XML文件(即在事件发生时刷新),请确保以下行:

<?xml-stylesheet type="text/xsl" href="cookies.xsl" ?>

指的是正确的XSLT样式表,根据哪个链接被点击。

XSLT功能

否则,可以使用result-document()函数从同一样式表中输出多个HTML文件。但是,只有在您拥有XSLT 2.0时才能使用此选项(请参阅:XSLT: :result-document)。从样式表来看,我假设您不使用XSLT 2.0处理器。

即使XSLT 1.0不包括输出多个文件,EXSLT也会这样做(参见例如:Splitting XML into multiple files with XSLT)。

复制并重命名XML

作为最后的手段,手动操作输入XML。复制XML数据并更改上面引用的引用行。请注意cookies1.xml包含

<?xml-stylesheet type="text/xsl" href="cookies1.xsl" ?>

并且cookies2.xml包含

<?xml-stylesheet type="text/xsl" href="cookies2.xsl" ?>

请注意,出现此问题的原因仅在于您对XML文件中样式表的引用进行了硬编码。