2009-05-08 2 views
1

Я пытаюсь выполнить преобразование XSL. Но замена атрибута не работает. У меня есть этот XSL:Замена значения атрибута в XSLT

<?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 document. Документ, естественно, содержит элемент html/head/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

Существует две проблемы:

<xsl:template match="/"> 
    <wml xml:lang="da"> 
    <card id="FrontPage" title="{html/head/title}"> 

Корневой документ ("/") не является <html> элементом. Это до<html> элемент.

Кроме того, как диво правильно указывает, вам не хватает пространства имен 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> 
0

Измените выражение соответствия шаблона для /html:

<xsl:template match="/html"> 
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.

+0

+1 для определения проблемы с пространством имен. – Tomalak

Смежные вопросы