Убедите Firefox анализировать HTML, встроенный в XML (после того, как XSL будет применен),

У меня есть некоторые 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
<xsl:value-of select="Title"/>

Это - определенный взлом и любые нечетные атрибуты, за которые я возлагаю ответственность на Visual Studio. Это - мой первый раз, бездельничая с XSL (относительно знакомый с XML, хотя), таким образом, у меня нет самого туманного, что сделать для фиксации этого.:)

Теперь, я считал этот вопрос: XSLT: Парсинг HTML встраивается в XML? и попробованный для интеграции этого в мой XML и XSL (как показано выше). Все еще не работает в Firefox, все же.

Править: Кроме того, я попробовал и xsl:value и xsl:copy производить содержание. Значение - выходного простого текста и отношений мое форматирование (из CSS), копия - выходного простого текста и руин мое форматирование (роняет к форматированию тела, игнорируя отделения и таблицу).

Edit2: Пересмотренный XSL для отражения предложений из ответов. Форматирование прекрасно, но встроенные теги все еще выходят как текст, не будучи интерпретированным.

1
задан Community 23 May 2017 в 12:30
поделиться

3 ответа

Во-первых, вам не нужны эти объявления:

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">
1
ответ дан 2 September 2019 в 23:00
поделиться

Ваш ввод 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>
0
ответ дан 2 September 2019 в 23:00
поделиться

Во-первых: я запускаю это с Firefox 3.5.9 . Нет проблем, но это неправильно.

Когда вы говорите:

<xsl:copy-of select="child::Body" /> 

Вы копируете элемент без пространства имен с его содержимым. И поскольку вы не объявляли этот контент с пространством имен XHTML, это не элементы XHTML. У них должно быть объявление xmlns = "" . Но моя версия Firefox работает неправильно: не интерпретировать элемент пространства имен (например, b ) как элементы XHTML (без пустого пространства имен!). Поскольку вы не предоставили таблицу стилей CSS, я не могу выполнить тест CSS (если ни один из элементов пространства имен не получит стиль).

Изменить : MSXSL правильно добавляет объявление xmlns = "" в Body , но затем IE отображает все, что хочет MS. JA!

1
ответ дан 2 September 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: