Замена значения атрибута в XSLT - PullRequest
1 голос
/ 09 мая 2009

Я пытаюсь выполнить 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. Документ, естественно, содержит элемент html / head / title. Я хочу, чтобы текстовое содержимое элемента title было вставлено в атрибут title элемента card:

<!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 ]

1 голос
/ 09 мая 2009

Вам не хватает объявления пространства имен 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 голосов
/ 09 мая 2009

Есть две проблемы:

<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>
0 голосов
/ 09 мая 2009

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

<xsl:template match="/html">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...