如何在XSLT中使用属性呈现自关闭HTML标记?

时间:2009-11-06 07:10:10

标签: xml xslt

好吧,我想渲染一个自我结束标记,说<img>这样的标记<img src="xyz.jpg" />

但我不知道该怎么做...我的意思是如何渲染一个自我关闭的标签。 到目前为止我所拥有的是: -

这是XML:

<c:Image src="xyz.jpg"></c:Image>

这是XSLT:

<xsl:output indent="yes" omit-xml-declaration="yes" method="html"  />
.
.
.
    <xsl:for-each select="c:Image">
     <img>
      <xsl:attribute name="src">
        <xsl:if test="string-length(@src)>0">
          <xsl:text></xsl:text>
          <xsl:value-of select="@src"/>
        </xsl:if>
        </xsl:attribute>
     </img>
    </xsl:for-each>
.
.
.

任何帮助表示感谢。

5 个答案:

答案 0 :(得分:2)

如果你有一个XSLT 2.0处理器,你可以为输出方法指定XHTML,它应该正确地序列化 img 元素。

<xsl:output method="xhtml" />

http://www.w3.org/TR/xslt-xquery-serialization/#xhtml-output

  

给定一个XHTML元素的内容   model是EMPTY,序列化器必须   使用最小化的标记语法   示例<br />,作为替代方案   XML允许的语法<br></br>给出   许多现有的不确定结果   用户代理。序列化器必须   在尾随之前包括一个空格   />,例如<br /><hr />和   <img> src="karen.jpg" alt="Karen" />

答案 1 :(得分:1)

<xsl:output method="html" version="4.0" /> 

可以做你想做的事。您甚至可以包含doctype-systemdoctype-public属性来输出特定的HTML DOCTYPE。请参阅documentation of <xsl:output>

如果你不想输出HTML,但是XML,你有点不知所措,我很害怕 <img></img><img />在语义上是等价的,XSLT处理器可以选择其他变体。你不应该太在乎。

答案 2 :(得分:1)

这有一种肮脏的方式:“愚弄”处理器并生成字符串

<xsl:for-each select="c:Image">
  <xsl:text disable-output-escaping="yes">&lt;img src="</xsl:text>
  <xsl:value-of select="@src" />
  <xsl:text disable-output-escaping="yes">" /&gt;</xsl:text>
</xsl:for-each>  

好的,我同意这是一个可怕的伎俩,但它适用于所有过程。

答案 3 :(得分:1)

XSLT不是为生成多语言文档而设计的。

<xsl:output method="html" />

将始终生成

<img src="xyz.jpg"> 

没有结束斜线。

<xsl:output method="xml" />

可能会产生

<img src="xyz.jpg" />

<img src="xyz.jpg"></img>

取决于处理器。

事实上,浏览器会使用其中任何一种做正确的事情,但是将xslt生成的xhtml发送到具有text / html内容类型的浏览器可能会导致问题,因为非空元素的标记如&lt; title /&gt; ,&lt; script /&gt;,&lt; a /&gt;等,很容易产生哪些浏览器会误解导致严重的渲染问题。

您必须决定是否要生成html或xhtml,并使用适当的内容类型发送(适用于xhtml的application / xhtml + xml - IE中不支持),或者对xslt输出进行后处理以确保自我结束标记仅用于规范空元素。

答案 4 :(得分:0)

<xsl:output method="html" />

尝试这是否有帮助