我有一个生成的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
代码中添加script
和head
代码,并希望在"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也没有添加标签......我做错了什么?
提前致谢!
答案 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
标记内需要它们。