2011-04-14 35 views
1

我试图使用XSLT(使用Javascript)来漂亮地打印已经被机器生成的XHTML文档。然而,我尝试过使用的各种XSLT,所有这些都改变了xmlns属性(见下文)。使用XSLT在不破坏名称空间信息的情况下打印XML/XHTML

下面是一个所需输出的示例(由手动从不缩进,紧凑的XHTML制作)。

<?xml version="1.0" encoding="UTF-8"?> 
<h:html xmlns:h="http://www.w3.org/1999/xhtml" xmlns:orx="http://openrosa.org/jr/xforms" xmlns="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jr="http://openrosa.org/javarosa"> 
    <h:head> 
    <h:title>New Form1</h:title> 
.... 

这里是我得到相反:

<h:html h="http://www.w3.org/1999/xhtml" orx="http://openrosa.org/jr/xforms" xmlns="http://www.w3.org/2002/xforms" xsd="http://www.w3.org/2001/XMLSchema" jr="http://openrosa.org/javarosa"> 
    <h:head> 
    <h:title>New Form1</h:title> 
... 

通知的XMLNS属性在改变“H:HTML”中的第二代码片段标记。此外,<?xml ...>标签缺失。

这是我用了相似的结果使用XSLT文件(许多之一):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\ 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 

什么我做错了任何想法?我想要做不可能的事情吗?

如果你想知道为什么我要这样做:我必须使用GWT作为设计FormDesigner Web应用程序的框架。这是输出,但对于想要进行手动编辑的技术更倾向的用户而言,需要人为可读。 GWT只是不会做 xml漂亮的打印(据我所知,迄今为止我可以告诉)。因此,我们本土的JS土地,并尝试在那里寻求解决方案。

想法/解决方案将不胜感激!

编辑:

这里是JavaScript,它利用了XSLT的。我所说的beautifyXML()函数来进行实际的缩进:

//var xsl_string = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="node()|@*">  <xsl:copy>  <xsl:apply-templates select="node()|@*"/>  </xsl:copy> </xsl:template></xsl:stylesheet>'; 


// from: http://www.xml.com/pub/a/2006/11/29/xslt-xml-pretty-printer.html?page=3 

var xsl_string = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\ 
<xsl:output method="xml" indent="yes"/>\ 
<xsl:strip-space elements="*"/>\ 
<xsl:template match="/">\ 
    <xsl:copy-of select="."/>\ 
</xsl:template>\ 
</xsl:stylesheet>'; 


var xsl = (new DOMParser()).parseFromString(xsl_string, "text/xml"); 


function stringToXml(xml_string) { 
    return (new DOMParser()).parseFromString(xml_string, "text/xml"); 
} 

function xmlToString(xml) { 
    return (new XMLSerializer()).serializeToString(xml); 
} 


function isParseError(xml) { 
    try { 
     // console.log( xml.documentElement.firstChild.firstChild.tagName); 
     return xml.documentElement.tagName == "parsererror" || 
       xml.documentElement.firstChild.firstChild.tagName == "parsererror"; 
    } 
    catch (ex) { 
     return false; 
    } 
} 
function beautifyXml(input) { 
    var xml = stringToXml(input); 

    if (isParseError(xml)) { 
     return input; 
    } 

    var transformedXml = xslTransformation(xml, xsl); 
    return xmlToString(transformedXml); 
} 

/** 
* @param xml 
* @param xsl 
*/ 
function xslTransformation(xml, xsl) { 
    // code for IE 
    if (window.ActiveXObject) { 
     var ex = xml.transformNode(xsl); 
     return ex; 
    } 
    // code for Mozilla, Firefox, Opera, etc. 
    else if (document.implementation && document.implementation.createDocument) { 
     var xsltProcessor = new XSLTProcessor(); 
     xsltProcessor.importStylesheet(xsl); 
     var resultDocument = xsltProcessor.transformToFragment(xml, document); 
     return resultDocument; 
    } 
} 
+0

是不是过分夸张? XML有效? – ThomasRS 2011-04-14 00:43:28

+0

你如何应用变换?你能发布JavaScript,还是将它埋在自动生成的GWT代码中?你的XSLT是好的(除了在'xsl:stylesheet'元素里面的尾部“\”。 – 2011-04-14 01:37:09

+0

@Thomas,xml是有效的,但是没有意义。xmlns:orx!= orx根据他们的意思作为属性 – adewinter 2011-04-14 13:52:02

回答

1

我终于找到了答案(只得到周围现在在这里张贴)。

事实证明,这个问题不在XSLT本身,而在于它是如何被javascript调用的。行:

var resultDocument = xsltProcessor.transformToFragment(xml, document); 

最后的代码示例中我在我的问题贴(近样品中的底部),应改为:

var resultDocument = xsltProcessor.transformToDocument(xml, document); 

(注:transformToFragment成为transformTo 文件) 此更改会导致现有的xmlns属性不被忽略,并且转换正确发生。

感谢您的帮助!评论中的问题使我找到了正确的解决方案。

相关问题