У меня есть некоторые XML-файлы этой формы:
Some thread title
Me
This is the post body, which may have embedded XHTML, including all sorts of things like:
Quotes
I know it's XHTML, though, the program spitting out XML verifies that.
Я должен отформатировать их в читаемые потоки, таким образом, я использую таблицу стилей CSS и таблицу стилей XSL. Работы CSS, я знаю для факта нет ничего неправильно с этим. Моя проблема, кажется, с XSL, поскольку любой встроил XHTML, не анализируется Firefox. В IE это работает отлично и выпускает надлежащее форматирование, но в Firefox это - совершенно простой текст. Я предполагаю, что это имеет отношение к тому, чтобы он был оставленным прежде чем быть произведенным, но я не могу выяснить, как предотвратить это.
XSL:
Post
(lastpost)
at
Это - определенный взлом и любые нечетные атрибуты, за которые я возлагаю ответственность на Visual Studio. Это - мой первый раз, бездельничая с XSL (относительно знакомый с XML, хотя), таким образом, у меня нет самого туманного, что сделать для фиксации этого.:)
Теперь, я считал этот вопрос: XSLT: Парсинг HTML встраивается в XML? и попробованный для интеграции этого в мой XML и XSL (как показано выше). Все еще не работает в Firefox, все же.
Править: Кроме того, я попробовал и xsl:value и xsl:copy производить содержание. Значение - выходного простого текста и отношений мое форматирование (из CSS), копия - выходного простого текста и руин мое форматирование (роняет к форматированию тела, игнорируя отделения и таблицу).
Edit2: Пересмотренный XSL для отражения предложений из ответов. Форматирование прекрасно, но встроенные теги все еще выходят как текст, не будучи интерпретированным.
Во-первых, вам не нужны эти объявления:
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
их можно безопасно удалить.
Во-вторых, вам никогда не нужно упоминать ось child ::
. Это неявно присутствует в XSLT, просто выбросьте его без замены.
В-третьих, переместите объявление пространства имен XHTML
xmlns="http://www.w3.org/1999/xhtml"
в элемент
и удалите его везде.
И последнее, но не менее важное: пробовали ли вы правильный метод вывода и тип носителя для XHTML?
<xsl:output method="xml" media-type="application/xhtml+xml">
Ваш ввод XML делает не имеют встроенного XHTML, поскольку для этого потребуется, чтобы те элементы, которые вы хотите распознавать как XHTML, находились в пространстве имен XHTML http://www.w3.org/1999/xhtml . Таким образом, вам нужно либо изменить ввод, чтобы поместить эти элементы в пространство имен XHTML, тогда вы действительно можете просто скопировать их из таблицы стилей в дерево результатов, либо вам нужно изменить таблицу стилей, чтобы преобразовать эти элементы в элементы из пространства имен XHTML. Следующее делает то же самое, а также вносит некоторые другие изменения, такие как установка version = "1.0":
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output
omit-xml-declaration="yes"
method="xml"
media-type="application/xhtml+xml"
indent="no"
doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
/>
<xsl:template match="Posts">
<xsl:for-each select="Post">
<tr class="Post">
<td>
<div>
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td class="Author">
<xsl:value-of select="Author"/>
</td>
<td class="Date">
Post <xsl:value-of select="PostID"/>
<xsl:choose>
<xsl:when test="count(LastPost) > 0">
(lastpost)
</xsl:when>
</xsl:choose> at <xsl:value-of select="Date"/>
</td>
</tr>
</table>
</div>
<div class="Body">
<xsl:apply-templates mode="to-xhtml" />
</div>
<xsl:choose>
<xsl:when test="count(Sig) = 1">
<div class="Sig">
<xsl:value-of disable-output-escaping="yes" select="Sig"/>
</div>
</xsl:when>
<xsl:when test="count(Sig) = 0">
<div class="SigFooter"> </div>
</xsl:when>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</xsl:template>
<xsl:template match="Thread">
<html>
<head>
<xsl:choose>
<xsl:when test="count(Title) = 1">
<title>
<xsl:value-of select="Title"/>
</title>
</xsl:when>
</xsl:choose>
<link href="resources/main.css" rel="stylesheet" type="text/css" />
</head>
<body>
<table class="Thread" align="center" width="90%" height="95%" cellpadding="2em">
<tr>
<td colspan="3">
<div class="Title">
<xsl:value-of select="Title"/>
<br />
<a href="whatis.xml">
<img src="resources/banner.png" />
</a>
</div>
</td>
</tr>
<xsl:apply-templates select="Posts"/>
<tr height="100%">
<td valign="bottom">
<div class="Footer">
Footer message n stuff
</div>
</td>
</tr>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="*" mode="to-xhtml">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* | node()" mode="to-xhtml"/>
</xsl:element>
</xsl:template>
<xsl:template match="@* | text() | processing-instruction() | comment()" mode="to-xhtml">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
Во-первых: я запускаю это с Firefox 3.5.9 . Нет проблем, но это неправильно.
Когда вы говорите:
<xsl:copy-of select="child::Body" />
Вы копируете элемент без пространства имен с его содержимым. И поскольку вы не объявляли этот контент с пространством имен XHTML, это не элементы XHTML. У них должно быть объявление xmlns = ""
. Но моя версия Firefox работает неправильно: не интерпретировать элемент пространства имен (например, b
) как элементы XHTML (без пустого пространства имен!). Поскольку вы не предоставили таблицу стилей CSS, я не могу выполнить тест CSS (если ни один из элементов пространства имен не получит стиль).
Изменить : MSXSL правильно добавляет объявление xmlns = ""
в Body
, но затем IE отображает все, что хочет MS. JA!