我正在尝试执行XSL转换。但属性替换不起作用。我有这个XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="UTF-8"
doctype-public="-//WAPFORUM//DTD WML 1.1//EN"
doctype-system="http://www.wapforum.org/DTD/wml_1.1.xml"/>
<xsl:template match="/">
<wml xml:lang="da">
<card id="FrontPage" title="{head/title}">
Why doesn't the title get inserted?
<p id="changed">The server processed this Jan 1st. 2009.</p>
</card></wml>
</xsl:template></xsl:stylesheet>
将要转换的XML是XHTML 1.0 Transitional文档。该文档自然包含html / head / title元素。我希望将title元素的文本内容插入到card元素的title属性中:
<!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>
<title>DMI - The weather on Faroe Islands</title>
(...)
我使用PHP 5.2.0和libxslt版本1.1.19。
答案 0 :(得分:1)
您缺少html命名空间声明。请尝试以下方法:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xsl:output encoding="UTF-8"
doctype-public="-//WAPFORUM//DTD WML 1.1//EN"
doctype-system="http://www.wapforum.org/DTD/wml_1.1.xml"
indent="yes"/>
<xsl:template match="/">
<wml xml:lang="da">
<card id="FrontPage" title="{xhtml:html/xhtml:head/xhtml:title}">
<p id="changed">The server processed this Jan 1st. 2009.</p>
</card>
</wml>
</xsl:template>
</xsl:stylesheet>
请注意,您可以将前缀从xhtml
更改为您喜欢的任何内容。
还有另一个较小的问题(可能基于一个常见的误解):/
表示文档根目录与文档中最顶层的节点不同(html
)。最顶层节点通常称为“根节点”,这是不正确的,即/
与最顶层节点不匹配。因此,必须将xhtml:html
添加到XPath表达式中。
答案 1 :(得分:0)
将模板匹配表达式更改为/html
:
<xsl:template match="/html">
答案 2 :(得分:0)
有两个问题:
<xsl:template match="/">
<wml xml:lang="da">
<card id="FrontPage" title="{html/head/title}">
文档根目录(“/”)不是<html>
元素。在 <html>
元素之前。
此外,正如divo正确指出的那样,您缺少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:output
encoding="UTF-8"
doctype-public="-//WAPFORUM//DTD WML 1.1//EN"
doctype-system="http://www.wapforum.org/DTD/wml_1.1.xml"
/>
<xsl:template match="/">
<wml xml:lang="da">
<card id="FrontPage" title="{x:html/x:head/x:title}">
<p id="changed">The server processed this Jan 1st. 2009.</p>
</card>
</wml>
</xsl:template>
</xsl:stylesheet>