Трансформация XSLT в PHP, неправильно выводит пустые тэги

AmadMike

Новичок
Трансформация XSLT в PHP, неправильно выводит пустые тэги

Добрый день.
Привожу простой пример.
Есть xml-файл (example.xml):
PHP:
<?xml version="1.0" encoding="UTF-8"?>
<mobile>
	<brand value="Nokia">
		<model value="8800">
			<bandwidth>GSM 900/1800/1900</bandwidth>
			<color>Silver</color>
		</model>
	</brand>
</mobile>
xsl-файл (example.xsl):
PHP:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl: output method="html" encoding="utf-8"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
	<xsl:template match="mobile">
		<html xmlns="http://www.w3.org/1999/xhtml">
			<head>
				<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
				<title>Title</title>
			</head>
			<body>
				<h1>Catalog of mobile phones</h1>
				<xsl:apply-templates />
			</body>
		</html>
	</xsl:template>
	<xsl:template match="model">
		<div>
			<h2>
				<xsl:value-of select="./@value" />
			</h2>
			<b>BandWith:</b>
			<xsl:text> </xsl:text>
			<xsl:value-of select="bandwidth" />
			<br />
			<b>Color:</b>
			<xsl:text> </xsl:text>
			<xsl:value-of select="color" />
		</div>
	</xsl:template>
</xsl:stylesheet>
Файл example.php:
PHP:
$doc = new DOMDocument();
$xsl = new XSLTProcessor();

$doc->load('example.xsl');
$xsl->importStyleSheet($doc);

$doc->load('example.xml');
$out = $xsl->transformToDOC($doc); //$out нужен будет для дальнейших целей
echo $out -> saveHTML();
На выходе получаем следующее:
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
<title>Title</title></head>
<body><h1>Catalog of mobile phones</h1>
	
		<div xmlns="">
<h2>8800</h2>
<b>BandWith:</b> GSM 900/1800/1900<br><b>Color:</b> Silver</div>
	
</body></html>
Вопрос: как заставить php выводить нормальный, закрывающийся тэг <br /> вместо <br> (причем для тэга meta он все-таки выводит закрывающийся тэг, но отдельно). Можно ли сделать так чтобы для каждого элемента не выводился пустой xmlns=""?

-~{}~ 13.11.06 22:04:

Ну с первой частью вопроса разобрался. Надо просто $out -> saveXML(); делать (причем значение output method="html" или "xml" здесь не имеют разницы, а для transformToXML как раз этим определятся).
Но не понял как заставить php не выводить пустые xmlns.
 

Solid

Drosera anglica
Атрибут method в output имеет очень важное значение, и в вашем случае правильнее использовать значение xml.
xmlns="http://www.w3.org/1999/xhtml" - перекиньте в stylesheet.

-~{}~ 13.11.06 22:12:

<xsl:template match="mobile"> поменяйте на <xsl:template match="/">
и купите себе книгу по XSLT :)
 

AmadMike

Новичок
Атрибут method в output имеет очень важное значение, и в вашем случае правильнее использовать значение xml.
Согласен, для случая с xhtml
xmlns="http://www.w3.org/1999/xhtml" - перекиньте в stylesheet
Спасибо, помогло. Даже практически понял что именно случилось :)
На счет книги тоже согласен, не помешает :)
<xsl:template match="mobile"> поменяйте на <xsl:template match="/">
Ну в данном примере согласен, но если мне шаблон надо применить не к корневому элементу...
 
Сверху