在XSLT中替换属性值

时间:2009-05-08 22:14:50

标签: xslt templates attributes

我正在尝试执行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。

3 个答案:

答案 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>