2012-03-02 2 views
0

Я не могу понять, что мне здесь не хватает. У меня есть веб-приложение Java, которое выводит XML с возможностью преобразования вывода в XHTML. Моя таблица стилей работает отлично, но для меня жизнь я не могу получить преобразованный вывод, чтобы написать doctype. Первый ребенок ниже моей XSL: таблицы стилей элемента:XSLT отказывается писать объявление DOCTYPE

<xsl:output method="xml" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" /> 

Даже если я пишу вывод в System.out, я могу подтвердить, что он не будет ставить декларацию DOCTYPE в верхней части. К сожалению, IE9 продолжает переходить в режим причуд при открытии этого документа, и мой CSS использует режим стандартов.

Я начал использовать Saxon 9.1.0.8 и просто вернулся к 8.7, чтобы увидеть, не имеет ли это никакого отношения к этому, но не повезло. У кого-нибудь есть идея, почему трансформатор отказывается добавлять doctype?

EDIT:

Я просто пытаюсь построить эту страницу (http://mark-allen.net/notes/layout/frames/example.html). Неважно, если я закомментирую свои другие шаблоны или применил их и поместил свой собственный контент в divs - я не включаю образец XML, потому что даже когда я вообще не применяю никаких шаблонов и просто пишу статический HTML контент, я не могу заставить его написать doctype.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 

    <xsl:output method="xml" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" /> 

    <xsl:param name="restUrl" /> 
    <xsl:param name="resourcesUrl" /> 

    <xsl:variable name="space"><xsl:text> </xsl:text></xsl:variable> 

    <xsl:template match="sos:Capabilities"> 
     <html xmlns="http://www.w3.org/1999/xhtml"> 
      <head> 
       <title>Capabilities</title> 
        <style type="text/css"> 
    body { 
     margin:0; 
     padding:0 10px 0 10px; 
     height:100%; 
     overflow-y:auto; 
    } 

    #header { 
     display:block; 
     top:0px; 
     left:0px; 
     width:100%; 
     height: 100px; 
     position:fixed; 
     clear: both; 
     border-bottom : 2px solid #cccccc; 
       background-color: black; 
    } 

    #header p.description { 
      color: #FF0000; 
    } 

    #navigation { 
     display:block; 
     top:120px; 
     left:0px; 
     width:380px; 
     height: 100%; 
     position:fixed; 
     border:1px solid #00FF00; 
    } 

    #navigation p.description { 
      color: #00FF00; 
    } 

    #content { 
     margin:100px 0px 60px 380px; 
     display:block; 
     padding:10px; 
     border:1px solid #0000FF; 
    } 

    #content p.description { 
     color: #0000FF; 
    } 

     #footer { 
       position: fixed; 
       width: 100%; 
       height: 60px; 
       right: 0; 
       bottom: 0; 

       border-top : 2px solid #cccccc; 
       background-color: black; 
       background-image: url("../images/saic.gif"); 
       background-position: right bottom; 
       background-repeat: no-repeat; 
     } 

    * html #header {position:absolute;} 
    * html #navigation {position:absolute;} 

      </style> 
      </head> 
      <body> 
       <div id="header"> 
        This is my header 
       </div> 
       <div id="navigation"> 
        Navigation 
       </div> 
       <div id="content"> 
        <p>lots of random text just to test</p> 
       </div> 
       <div id="footer"> 
        footer 
       </div>  
       </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

EDIT2:

Вот мой код преобразования в двух словах:

System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl"); 
      org.dom4j.io.DocumentSource source = new DocumentSource(queryResponseDocument); 
      Source xsltSource = new StreamSource(new File(contextPath, xsltFileName)); 
      org.dom4j.io.DocumentResult result = new DocumentResult(); 

      TransformerFactory transFact = TransformerFactory.newInstance(); 
      Transformer trans = transFact.newTransformer(xsltSource); 
      trans.transform(source, result); 
      transformedQueryResponse = result.getDocument(); 
      response.setContentType(mimeType); 
      org.dom4j.io.OutputFormat format = OutputFormat.createPrettyPrint(); 
      org.dom4j.io.XMLWriter writer = new XMLWriter(response.getOutputStream(), format); 
+1

Я не могу воспроизвести эту проблему в своих преобразованиях, используя предоставленный 'xsl: output' - файл DOCTYPE * написан. Вероятно, это означает, что проблема заключается в документе XML и XSLT-коде, который вы не указали. Не могли бы вы отредактировать вопрос и добавить небольшой XML-документ и небольшое преобразование XSLT, чтобы каждый мог применить преобразование к XML и воспроизвести проблему? –

ответ

3

Наиболее вероятным объяснением является то, что вывод таблицы стилей не сериализации с помощью сериалайзер Saxon. Например, вы можете записывать вывод в DOM, а затем использовать сериализатор DOM для создания лексического XML.

Это только предположение, однако - вы не указали никакой информации о том, как выполняется преобразование.

+0

Таким образом, проблема заключается в использовании xmlwriter dom4j. Какое лучшее решение? Я не уверен, как использовать сериализатор Saxon. Единственный класс сериализатора, который я могу найти, находится в пакете net.sf.saxon.s9api, который я предполагаю для v9, но я использую 8.7. Это хак-иш, чтобы заставить автора dom4j ввести doctype? Не уверен, куда идти ... – Bal

+0

Если вы используете преобразование с использованием интерфейсов JAXP, просто отправьте результат в объект StreamResult и будете использовать сериализатор процессора XSLT. –