XSLT:如何将内容转换为非xml格式?

7

是否可以使用XSLT将XML转换为其他格式而不是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)形成对比,在xhtml中,所有元素都需要有结束标签(因为在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>

"<img />"和"<br />"有什么问题?" - kennytm
@KennyTM:HTML禁止在IMG和BR上使用闭合标签。这并不是因为闭合标签有冒犯性,而是因为正确的HTML不应该包含它们。 - Ian Boyd
3个回答

9
您可以使用<xsl:output>来指定输出格式,这个格式不一定是xml,可以参考这个页面。但是,如果您要输出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')

@Alan Chan:问题不在于生成浏览器可能能够处理的无效HTML,而在于生成有效的HTML以便解析器能够处理它。 - Ian Boyd
@Ian:好的,我明白了。如果你使用<xsl:output method="html">来指定输出为HTML,然后使用xsl:element来创建HTML标记...例如<xsl:element name="IMG"><xsl:attribute name="src">file1.png</xsl:attribute></xsl:element>,那么XSLT处理器应该会生成必要的<IMG>、<BR>等标记,而无需为HTML添加关闭标记。 - Alan Chan

5
无论您如何创建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>

当我复制这个时,闭合标签也被包含在内。同时,有时我可能想要包含可选的闭合标签,有时则不想要。XSLT需要能够将XML转换为我所需的输出格式。 - Ian Boyd

1

可以的,你可以在样式表中使用 xsl:output元素来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接