它在浏览器中将转换后的xml显示为纯文本

它在浏览器中将转换后的xml显示为纯文本,xml,xslt,transformation,Xml,Xslt,Transformation,使用xml转换时,我的浏览器(?)中存在渲染问题或其他问题,因此我有这个book.xml文档 <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="book.xsl"?> <books> <book title="AA" price="1"/> <book title="AB" price="3"/> <book ti

使用xml转换时,我的浏览器(?)中存在渲染问题或其他问题,因此我有这个
book.xml
文档

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="book.xsl"?>
<books>
  <book title="AA" price="1"/>
  <book title="AB" price="3"/>
  <book title="AC" price="6"/>
</books> 
但是浏览器
firefox
IE
Chrome
像纯文本一样显示:

AA 1 AB 3 AC 6
如何强制输出到xml
xsl:output method=“xml”
不起作用?

我同意。浏览器用来显示HTML内容,而不是像您所期望的那样显示XML内容。现代浏览器似乎不具备这种使用场景

事实上,无论出于何种原因,XML+XSLT场景似乎普遍受到轻视

我也不明白/我确实很明白

IMHO这种方法远远优于目前的WWW。使用XSLT将XML文件转换为XHTML-5(实际上不存在)客户端将是对Web技术的巨大改进

  • 从技术上来说,这对每个人都是很好的
  • 从商业角度来说,这将是灾难性的,因为这将有效地消除大数据
猜猜谁赢了

那么,回到回答您的问题:
浏览器确实呈现HTML,因此设置
,并用HTML标记围绕输出,如下所示:

<?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" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:template match="/">
   <html>
     <body>
       <table border="1">
         <xsl:apply-templates select="books/book" />
       </table>
     </body>
   </html>
  </xsl:template>

  <xsl:template match="book">
    <tr>                                                                    <!-- changed from <books> -->
      <td width="100" align="center"><xsl:value-of select="@title"/></td>   <!-- changed from <title> -->
      <td width="60"  align="center"><xsl:value-of select="@price"/></td>   <!-- changed from <price> -->
    </tr>
  </xsl:template>

</xsl:stylesheet>


此模板将为您提供一个在现代浏览器上显示良好的结果(为
文件启用NoScript规则://
!)。

如果您希望在浏览器中使用XML到XML的转换,那么对于浏览器知道要呈现的结果格式(如XHTML和/或SVG和/或MathML),它最有意义。对于未知的、任意的XML格式,浏览器只呈现未设置样式的结果树,所以基本上是文本节点。我认为只有Opera曾经将其可折叠的XML源代码视图呈现应用于XML转换结果

在其他浏览器中,为了获得一些视觉上有意义的呈现,您可以将CSS应用于结果文档,就像我使用XSLT代码并调整它以输出处理指令
xml样式表
将CSS样式表与转换结果元素相关联一样,基本上,将
book
结果呈现为一个表,其中
book
元素构成行,子元素构成单元

所以XSLT是

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="/">
    <xsl:processing-instruction name="xml-stylesheet">type="text/css" href="test2017022801.css"</xsl:processing-instruction>
    <books>
        <xsl:for-each select="books/book">
          <book>
            <title><xsl:value-of select="@title"/></title>
            <price><xsl:value-of select="@price"/></price>
          </book>
        </xsl:for-each>
    </books>
  </xsl:template>
</xsl:stylesheet>
然后,我尝试过的四种浏览器(当前版本的IE、Edge、Firefox和Windows10上的Chrome)都将XML结果数据呈现为一个表


但是,在我看来,简单地将XML转换为具有所需语义和呈现方式的HTML元素,而不是尝试使用类似于HTML的CSS样式XML,这更有意义,也更容易实现。

对于未知的XML格式,您希望采用哪种呈现方式?如果将浏览器中的XML转换为XHTML和/或SVG和/或MathML,则浏览器中的XML到XML转换是有意义的,因为浏览器知道要呈现这些XML和/或MathML,但如果浏览器知道要呈现这些XML和/或SVG和/或MathML,那么浏览器中的XML到XML转换将是有意义的,否则,您将在没有任何语义的情况下呈现文本节点。@MartinHonnen浏览器能够显示XML文档的XML视图(没有相关联的样式,因此,我们有理由期望他们也能给出XML文档的XML视图,这是一个转换结果。@wero,我认为Opera曾经这样做过,但其他人没有。在呈现doctype、CDATA等内容时,浏览器之间的XML视图也有很大差异。至于XML到XML转换的当前结果,我认为它不是纯文本,而是一个未设置样式的DOM树的呈现。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="/">
    <xsl:processing-instruction name="xml-stylesheet">type="text/css" href="test2017022801.css"</xsl:processing-instruction>
    <books>
        <xsl:for-each select="books/book">
          <book>
            <title><xsl:value-of select="@title"/></title>
            <price><xsl:value-of select="@price"/></price>
          </book>
        </xsl:for-each>
    </books>
  </xsl:template>
</xsl:stylesheet>
books {
    margin: 1em;
    border-spacing: 2px;
    border-collapse: collapse;
    display: table;
    border: 1px solid black;
}
book {
    display: table-row;
}
title, price {
    display: table-cell;
    border: 1px solid black;
    padding: 2pt;
}