2010-05-01 45 views
6

是否可以使用XSLT将XML转换为XML以外的东西?XSLT:转换为非xml内容?

例如我想最终非XML内容:

<Content> 
    <image url="file1.png"> 
    <image url="file2.png"> 
    ... 
    <image url="filen.png"> 
<EndContent> 

你通知这份文件不是XML(甚至HTML),但它确实有<elements>

是否有可能使用XSLT生成非xml输出?


非XML输出的另一个例子是:

<HTML> 
<BODY> 
    <IMG src="file1.png"><BR> 
    <IMG src="file2.png"><BR> 
    ... 
    <IMG src="filen.png"><BR> 
</BODY> 
</HTML> 

你会发现这个文件是HTML,因为在HTML IMGBR标签禁止从具有封闭标签。这与xhtml相反,使用xml重新构造HTML,其中所有元素都必须具有结束标记(因为xml中的每个标记都必须关闭)。


非XML输出的另一个示例可能是:

INSERT INTO Documents (Filename) VALUES ('file1.png') 
INSERT INTO Documents (Filename) VALUES ('file2.png') 
... 
INSERT INTO Documents (Filename) VALUES ('file3.png') 

我可以弥补任何源XML我喜欢,但一个实例可能是:

源XML:

<DocumentStore> 
    <Document type="image">file1.png</Document> 
    <Document type="image">file2.png</Document> 
    <Document type="image">filen.png</Document> 
</DocumentStore>  

或者也许:

<Profiles> 
    <User avatar="file1.png" /> 
    <User avatar="file2.png" /> 
    <User avatar="filen.png" /> 
</Profiles> 
+0

''和'
'有什么问题? – kennytm 2010-05-01 11:57:10

+0

@KennyTM:HTML禁止在IMG和BR上关闭标签。这并不是说封闭标签是令人反感的。这只是适当的HTML不会有他们。 – 2010-05-01 23:46:43

回答

8

您可以使用<xsl:output>指定输出格式,该格式不必是xml,请参阅this reference page

但是,如果你是输出HTML,没有现代的浏览器应该抱怨,即使你把结束标记,因此使用你上面的例子,我相信所有的浏览器应该是确定有: -

<HTML> 
<BODY> 
    <IMG src="file1.png"></IMG><BR></BR> 
    <IMG src="file2.png"></IMG><BR></BR> 
    ... 
    <IMG src="filen.png"></IMG><BR></BR> 
</BODY> 
</HTML> 

所以不太清楚为什么你不想把结束标签,除非我失去了一些东西。


更新:非XML输出

鉴于这种样式的新增例如: -

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:template match="/filenames"> 

    <xsl:for-each select="filename"> 
    INSERT INTO Documents (Filename) VALUES ('<xsl:value-of select="." />') 
    </xsl:for-each> 

    </xsl:template> 
</xsl:stylesheet> 

与此输入XML: -

<?xml version="1.0" encoding="UTF-8"?> 
<filenames> 
    <filename>file1.png</filename> 
    <filename>file2.png</filename> 
    <filename>file3.png</filename> 
</filenames> 

你得到的输出象这个: -

INSERT INTO Documents (Filename) VALUES ('file1.png') 

INSERT INTO Documents (Filename) VALUES ('file2.png') 

INSERT INTO Documents (Filename) VALUES ('file3.png') 
+0

@Alan Chan:与其说浏览器无法处理HTML生成无效HTML,它会生成有效的HTML,以便解析器可以处理它。 – 2010-05-01 23:54:37

+0

@伊恩:好吧,我明白了。那么,如果您使用指定输出为html,然后使用创建html标记...例如 file1.png则xslt处理器应生成,
等标记没有html所需的结束标记。 – 2010-05-02 16:13:39

4

不管你如何建立你的IMG标签,

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html"/> 
<xsl:template match="/"> 
<HTML> 
<BODY> 
    <xsl:element name="IMG"> 
    <xsl:attribute name="src">file1.png</xsl:attribute> 
    </xsl:element> 
    <IMG src="file2.png"></IMG> 
    <IMG src="filen.png"/> 
</BODY> 
</HTML> 
</xsl:template> 
</xsl:stylesheet> 

输出方法“HTML”将导致IMG标签不被关闭。

<HTML> 
<BODY><IMG src="file1.png"><IMG src="file2.png"><IMG src="filen.png"></BODY> 
</HTML> 
+0

当我重现这一点时,包含结束标签。同时,我有时可能希望包含可选的结束标签,有时我可能不想。 XSLT需要能够将xml转换为我所需的**输出格式。 – 2010-06-30 01:30:24