【问题标题】:XSLT: Transforming into non-xml content?XSLT:转换成非 xml 内容?
【发布时间】:2010-05-01 11:54:24
【问题描述】:

是否可以使用 XSLT 将 XML 转换为 XML 以外的东西?

例如我想要最终的 non-xml 内容:

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

您会注意到此文档不是 xml(甚至不是 html),但它确实包含我们所说的 &lt;elements&gt;

是否可以使用 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>

【问题讨论】:

  • &lt;img /&gt;&lt;br /&gt; 有什么问题?
  • @KennyTM:HTML 禁止 IMG 和 BR 上的结束标签。这并不是说结束标签令人反感。只是正确的 HTML 不会有它们。

标签: html xslt


【解决方案1】:

可以使用&lt;xsl:output&gt;指定输出格式,不一定是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')

【讨论】:

  • @Alan Chan:与其说是生成浏览器可能能够处理的无效 HTML;它正在生成有效的 HTML,以便解析器可以处理它。
  • @Ian:好的,我明白了。好吧,如果您使用 指定输出为 html,然后使用 创建 html 标签...例如file1.png 那么 xslt 处理器应该产生 ,
    ,等等,没有结束标签的标签是 html 所要求的。
【解决方案2】:

无论您如何创建 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 转换为我的所需输出格式。
【解决方案3】:

是的,您可以通过在样式表中使用 xsl:output 元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2017-12-29
    • 2015-11-28
    相关资源
    最近更新 更多