2017-01-25 5 views
0

Я следующий XML код (test.xml):XSL - для каждого-не работает

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="test.xsl" ?> 
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <url>http://www.url.com/1/</url> 
    <url>http://www.url.com/2/</url> 
    <url>http://www.url.com/3/</url> 
</urlset> 

Тогда, я хочу дать ему некоторый стиль со следующим кодом (XSL test.xsl):

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Test</title> 
</head> 
<body> 
    <xsl:for-each select="/urlset/url"> 
     <div> 
      one address here (no matter which) 
     </div> 
    </xsl:for-each> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

По какой-то причине нет результата, всего лишь blank page.

Я только что последовал примеру кода, который я пробовал несколько лет назад, который работал на меня, но это не работает.

Любая идея о том, как это решить?

+1

Это XSLT вопрос номер # 1 здесь : просто найдите «XSLT-пространство имен по умолчанию». Кто-то спрашивает его почти каждый день. –

ответ

2

Я просто следовал пример кода, я попробовал несколько лет назад, что работал для меня

код работал несколько лет назад, предположительно потому, что тогда, ваш входной документ не имеет имен.

Теперь ваш входной документ имеет пространство имен по умолчанию, которое необходимо учитывать в таблице стилей XSLT. Ваша таблица стилей работает, если вы используете redeclare это пространство имен в таблице стилей и префикс все имена элементов, поступающие из входного документа.

Я думаю, вы, вероятно, хотите следующую таблицу стилей, которая выводит содержимое всех url элементов:

таблицы стилей XSLT

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:stmp="http://www.sitemaps.org/schemas/sitemap/0.9"> 

<xsl:output method="xml" indent="yes"/> 

<xsl:template match="/"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Test</title> 
</head> 
<body> 
    <xsl:for-each select="/stmp:urlset/stmp:url"> 
     <div> 
      <xsl:value-of select="."/> 
     </div> 
    </xsl:for-each> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

XHTML Выходной

<?xml version="1.0" encoding="UTF-8"?> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:stmp="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
     <title>Test</title> 
    </head> 
    <body> 
     <div>http://www.url.com/1/</div> 
     <div>http://www.url.com/2/</div> 
     <div>http://www.url.com/3/</div> 
    </body> 
</html> 

Но ваш стиль программирования XSLT также может быть улучшенными. Вместо ненужного xsl:for-each используйте xsl:apply-templates и напишите отдельный шаблон для url элементов.

таблицы стилей XSLT (улучшенный)

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:stmp="http://www.sitemaps.org/schemas/sitemap/0.9"> 

<xsl:output method="xml" indent="yes"/> 

<xsl:template match="/"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Test</title> 
</head> 
<body> 
    <xsl:apply-templates/> 
</body> 
</html> 
</xsl:template> 

<xsl:template match="stmp:url"> 
    <div xmlns="http://www.w3.org/1999/xhtml"> 
     <xsl:value-of select="."/> 
    </div> 
</xsl:template> 

</xsl:stylesheet> 

Выходной сигнал будет такой же. Попробуйте сами онлайн here.

+0

, который сработал, спасибо! – Angel

-1

Это простой способ, что вы пытаетесь достичь:

Ваш XML код:

<?xml version="1.0" encoding="UTF-8"?> 
    <urlset> 
    <url>http://www.url.com/1/</url> 
    </urlset> 

Ваш XSLT код:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
     <xsl:value-of select="urlset/url"/> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 
+2

Вы только что переместили сообщения цели; фактический входной документ имеет _namespace_, и это имеет большое значение. –