XML не отображается в таблице стилей XSL

#xml #xslt

#xml #xslt

Вопрос:

У меня проблема с неправильным отображением моего XML. В принципе, у меня есть XML-документ, полный ссылок, и я хочу, чтобы таблица стилей XSL выводила XML в виде упорядоченного списка. На данный момент все работает правильно, и стиль правильный, но данные для ссылок не отображаются. Вы просто видите стилизованный фон. Я правильно подключил XML к XSL, и Dreamweaver без проблем проверил XML-код. Не уверен, чего мне здесь не хватает?

test.xml

 <?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="teststyle.xsl"?>
<country xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<au>
    <open>amp;<liamp;>amp;<a href="/contest/test/goto.php?id=0" target="_blank"amp;></open>
    <description>Win a Macbook!</description>
    <close>amp;</aamp;>amp;</liamp;></close>
</au>
<au>
    <open>amp;<liamp;>amp;<a href="/contest/test/goto.php?id=1" target="_blank"amp;></open>
    <description>Win a trip to Las Vegas!</description>
    <close>amp;</aamp;>amp;</liamp;></close>
</au>
</country>
  

teststyle.xsl

 <?xml version="1.0" encoding="utf-8"?><!-- DWXMLSource="test.xml" -->
<!DOCTYPE xsl:stylesheet  [
<!ENTITY nbsp   "amp;#160;">
<!ENTITY copy   "amp;#169;">
<!ENTITY reg    "amp;#174;">
<!ENTITY trade  "amp;#8482;">
<!ENTITY mdash  "amp;#8212;">
<!ENTITY ldquo  "amp;#8220;">
<!ENTITY rdquo  "amp;#8221;"> 
<!ENTITY pound  "amp;#163;">
<!ENTITY yen    "amp;#165;">
<!ENTITY euro   "amp;#8364;">
]>
<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     Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Untitled Document</title>
</head>

<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
    <xsl:for-each select="country/au">
        <div style="background-color:teal;color:white;padding:4px">
        <ol>
            <span style="font-weight:bold"><xsl:value-of select="country/au/open" /><xsl:value-of select="country/au/description"/><xsl:value-of select="country/au/close"/></span>
        </ol>
    </div>
</xsl:for-each>
</body>
</html>

</xsl:template>
</xsl:stylesheet>
  

Ответ №1:

Когда у вас есть блок «для каждого», тогда все инструкции внутри этого блока относятся к элементу, в котором вы их запускаете. Это означает, что вместо

 <xsl:value-of select="country/au/open" />
  

вы должны просто использовать

 <xsl:value-of select="open" />
  

Кроме того, предполагая, что вам действительно нужны символы < и> из блоков «открыть» и «закрыть», вам необходимо отключить экранирование выходных данных по этим ссылкам. В противном случае вы получите escape-коды на своей странице.

Вот полная, рабочая версия вашего XSL:

 <?xml version="1.0" encoding="utf-8"?><!-- DWXMLSource="test.xml" -->
<!DOCTYPE xsl:stylesheet  [
<!ENTITY nbsp   "amp;#160;">
<!ENTITY copy   "amp;#169;">
<!ENTITY reg    "amp;#174;">
<!ENTITY trade  "amp;#8482;">
<!ENTITY mdash  "amp;#8212;">
<!ENTITY ldquo  "amp;#8220;">
<!ENTITY rdquo  "amp;#8221;"> 
<!ENTITY pound  "amp;#163;">
<!ENTITY yen    "amp;#165;">
<!ENTITY euro   "amp;#8364;">
]>
<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     Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Untitled Document</title>
</head>

<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
    <xsl:for-each select="country/au">
        <div style="background-color:teal;color:white;padding:4px">
            <ol>
                <span style="font-weight:bold"><xsl:value-of select="open" disable-output-escaping="yes" /><xsl:value-of select="description"/><xsl:value-of select="close" disable-output-escaping="yes"/></span>
            </ol>
        </div>
    </xsl:for-each>
</body>
</html>

</xsl:template>
</xsl:stylesheet>
  

Однако я бы настоятельно рекомендовал не помещать экранированный HTML-код в ваш xml подобным образом. Не очень понятно, что происходит, и при экранировании всех символов возникает много ненужной путаницы. Было бы лучше выяснить, какие данные вам действительно нужны, и использовать XSL для преобразования данных в допустимый HTML. Например, если вы изменили свой файл XML-данных на этот:

 <?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="teststyle.xsl"?>
<country xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<au>
    <url>/contest/test/goto.php?id=0</url>
    <target>_blank</target>
    <description>Win a Macbook!</description>
</au>
<au>
    <url>/contest/test/goto.php?id=1</url>
    <target>_blank</target>
    <description>Win a trip to Las Vegas!</description>
</au>
</country>
  

тогда этот XSL делает поведение немного более понятным (и вам не нужно обрабатывать какие-либо экранирования!):

 <?xml version="1.0" encoding="utf-8"?><!-- DWXMLSource="test.xml" -->
<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     Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Untitled Document</title>
</head>

<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
    <xsl:for-each select="country/au">
        <div style="background-color:teal;color:white;padding:4px">
            <ol style="font-weight:bold">
                <a href="{url}" target="{target}"><xsl:value-of select="description"/></a>
            </ol>
        </div>
    </xsl:for-each>
</body>
</html>

</xsl:template>
</xsl:stylesheet>
  

Комментарии:

1. Вау, спасибо! Я только сегодня начал изучать XML / XSL, так что я все еще осваиваюсь.