【问题标题】:Self closing tags in xsl method: xmlxsl 方法中的自闭合标签:xml
【发布时间】:2013-03-08 23:37:56
【问题描述】:

我正在使用一个使用“xsl 方法:xml”来创建 html 模板的网站。但是,当 html 页面由 xsl 引擎呈现时,我遇到了标签自动关闭的问题。

<div></div> 转换为 => <div/>

由于方法需要保留 xml,否则页面的其他组件将无法正确呈现,这使问题更加复杂。

关于如何告诉 xsl 为节点 <div> 做一个特殊例外的任何想法?

这个问题和这个问题类似,只是我想保留method:xml。 XSLT self-closing tags issue

【问题讨论】:

    标签: xml xslt html methods


    【解决方案1】:

    method=xml 时默认不可用。您可以通过以下几种方式处理它:

    选项 1 - 切换到 method=xhtml

    如果你不能切换到method=xml,而你使用的是XSLT 2.0解析器,也许你可以试试method=xhtml?

    <xsl:output method="xhtml" indent="yes" />
    

    这将使您的结束标签被呈现。

    选项 2 - 为 'div' 标签添加空格

    或者,只需添加&lt;xsl:text&gt; &lt;/xsl:text&gt;(标签之间有一个空格)以使您的&lt;div&gt; 不为空(当然,如果您可以使用空格)。

    考虑以下 XML:

    <div></div>
    

    当转换为:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    
      <!-- output is xml -->
      <xsl:output method="xml" indent="yes" />
    
      <xsl:template match="div">
        <div>
          <!-- note space here -->
          <xsl:text> </xsl:text>
          <xsl:value-of select="text()" />
        </div>
      </xsl:template>
    </xsl:stylesheet>
    

    它产生输出:

    <?xml version="1.0" encoding="UTF-8"?>
    <div> </div>
    

    【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。问题是 XmlTextWriter 只会弄乱 html。试试下面的代码:

    public static string Transform(string xmlPath, string xslPath, XsltArgumentList xsltArgumentList)
        {
            string rc = null;
            using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
            {
                XPathDocument myXPathDoc = new XPathDocument(xmlPath);
                XslCompiledTransform myXslTrans = new XslCompiledTransform();
                myXslTrans.Load(xslPath, new XsltSettings(true, true), null);
                myXslTrans.Transform(myXPathDoc, xsltArgumentList, ms);
                ms.Position = 0;
                using (System.IO.TextReader reader = new System.IO.StreamReader(ms, Encoding.UTF8))
                {
                    rc = reader.ReadToEnd();
                }
            }
            return rc;
        }
    

    我使用 XsltArgumentList 将信息传递给 xslt。如果您不需要将参数传递给您的 xslt,您可以像这样调用该方法:

    string myHtml = Transform(myXmlPath, myXslPath, new XsltArgumentList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 2023-02-10
      相关资源
      最近更新 更多