【问题标题】:How to render a self closing HTML tag with attributes in XSLT?如何在 XSLT 中呈现带有属性的自闭合 HTML 标记?
【发布时间】:2009-11-06 07:10:09
【问题描述】:

好吧,我想渲染一个自闭标签,比如 <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>
.
.
.

任何帮助表示赞赏。

【问题讨论】:

    标签: xml xslt


    【解决方案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>  
    

    好的,我同意这是一个糟糕的技巧,但它适用于所有 proc。

    【讨论】:

    • 不,它不适用于所有处理器。对于 XSLT 处理器,禁用输出转义的实现是可选的。
    • 你是对的,但我还没有遇到不支持此功能的“主流”处理器。你认识一个吗?
    • 我以前用过一个,但我不记得现在是什么了。我不知道目前使用的任何一种。我没有对此进行测试,但我想知道如果在浏览器中应用 XSLT 是否会起作用,因为要工作,必须对输出进行序列化和重新解析,而不是输出树直接变成 DOM。你知道它是否适用于所有知名浏览器吗?
    • 感谢上帝您自己添加了它,这是一种肮脏的方式,否则您可能会得到很多反对票!
    • 实际上,disable-output-escaping 是一个非常可怕的功能,而且很容易被滥用,以至于它被认真考虑在 XSLT 2.0 中删除,并且仅出于向后兼容的原因保留:w3.org/TR/2007/REC-xslt20-20070123/#d-o-e-in-data-model
    【解决方案2】:

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

    <xsl:output method="xhtml" />
    

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

    给定一个 XHTML 元素,其内容 模型为空,序列化器必须 使用最小化的标签语法,对于 例如&lt;br /&gt;,作为替代 XML 允许的语法 &lt;br&gt;&lt;/br&gt; 给出 许多现有的不确定结果 用户代理。序列化程序必须 在尾随前包含一个空格 /&gt;,例如&lt;br /&gt;&lt;hr /&gt;&lt;img&gt; src="karen.jpg" alt="Karen" /&gt;

    【讨论】:

      【解决方案3】:
      <xsl:output method="html" version="4.0" /> 
      

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

      如果你不想输出HTML,而是输出XML,恐怕你有点不知所措。
      &lt;img&gt;&lt;/img&gt;&lt;img /&gt;在语义上是等价的,XSLT处理器可以选择eiher变体.你不应该太在意。

      【讨论】:

      • 对不起......因为没有提到问题的重要组成部分之一。我现在已将其包含在问题中。现在有什么想法吗??
      • 在这种情况下 - 我会说它也依赖于 XSLT 处理器。使用 msxsl.exe 进行测试时,&lt;img&gt; 标记输出为隐式关闭 - 不生成 /&gt; 并且不生成 &lt;/img&gt;
      • 顺便说一句 - omit-xml-declarationmethod="html" 是多余的。
      • 是的,我的硬件 XSLT 加速器也关闭了标签。 Tomalak 是对的,它是 proc 依赖的。
      【解决方案4】:

      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 内容类型的浏览器可能会导致问题,因为标签为非空元素,如

      ,、 等很容易产生,浏览器会误解从而导致严重的渲染问题。

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

      【讨论】:

        【解决方案5】:
        <xsl:output method="html" />
        

        如果有帮助就试试

        【讨论】:

        • 它已经在我的代码中了..抱歉这里没有提到。我确实编辑了我的问题..现在有任何想法....
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 2018-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多