使用xslt </script>插入<link />和<script>标记和xmlns

时间:2015-02-17 10:25:58

标签: xml xslt insert

我有一个生成的xhtml文件,该文件以下列内容开头:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Manual</title>
    <meta name="generator" content="DocBook XSL Stylesheets V1.78.1" />
    <meta name="keywords" content="Software logistics, ticket" />
</head>
<body>
...
</body>
</html>

现在,我想在link代码中添加scripthead代码,并希望在"xmlns:ui="http://java.sun.com/jsf/facelets"代码中添加html。 到目前为止我使用的是以下xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" 
        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
        doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
        indent="yes" encoding="iso-8859-1"/>

<xsl:template match="/html">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets">
          <xsl:apply-templates select="@*|node()"/>
    </html>
</xsl:template>

<xsl:template match="/html/head">
    <link rel="stylesheet" type="text/css" media="screen"
        href="common/css/screen.css" />
    <link rel="stylesheet" type="text/css" media="print"
        href="common/css/print.css" />
    <script src="../../common/js/common.js" type="text/javascript"></script>
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

但它不起作用。输出应该是一个xhtml文件,我使用xsltproc将我的xsl表应用于xhtml输入文件。既没有添加xmlns:ui也没有添加标签......我做错了什么?

提前致谢!

1 个答案:

答案 0 :(得分:1)

您的方法存在的问题是您的前两个模板与任何内容都不匹配。它们不匹配任何内容,因为源文档中的元素位于xhtml命名空间中 - 您必须相应地调用它们:

首先,在stylesheet元素中声明xhtml命名空间并为其指定前缀:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x ="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="x">

有了这个,你就可以做到:

<xsl:template match="/x:html">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets">
          <xsl:apply-templates select="@*|node()"/>
    </html>
</xsl:template>

您还需要在复制的命名空间中放置任何新元素 - 因此您的第二个模板需要看起来更像这样:

<xsl:template match="x:head">
    <xsl:copy>
        <x:link rel="stylesheet" type="text/css" media="screen"
            href="common/css/screen.css" />
        <x:link rel="stylesheet" type="text/css" media="print"
            href="common/css/print.css" />
        <x:script src="../../common/js/common.js" type="text/javascript"></x:script>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

请注意,我已在xsl:copy指令中移动了新元素,因为您说在head标记内需要它们。