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

Insert <link> and <script> tags and xmlns using xslt

我生成了一个以以下内容开头的 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>

现在,我想在 head 标签内添加 linkscript 标签,我想在 html 标签内添加 "xmlns:ui="http://java.sun.com/jsf/facelets"。 到目前为止,我正在使用以下 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 sheet 应用到 xhtml 输入文件。既没有添加 xmlns:ui 也没有添加标签...我做错了什么?

提前致谢!

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

首先,在您的样式表元素中声明 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 标记中。