使用 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
标签内添加 link
和 script
标签,我想在 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
标记中。
我生成了一个以以下内容开头的 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
标签内添加 link
和 script
标签,我想在 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
标记中。