4

「xsl method:xml」を使用して html テンプレートを作成するサイトで作業しています。ただし、html ページが xsl エンジンによってレンダリングされると、タグが自己終了するという問題が発生しています。

<div></div>=>に変換します<div/>

この問題は、メソッドが xml のままである必要があるという事実によって悪化します。そうしないと、ページの他のコンポーネントが正しくレンダリングされません。

ノードに対して特別な例外を作成するよう xsl に指示する方法についてのアイデアはあります<div>か?

この質問はこの質問と似ていますが、メソッド:xml を保持したい点が異なります。 XSLT 自己終了タグの問題

4

2 に答える 2

8

method=xml では、デフォルトでは使用できません。いくつかの方法で処理できます。

オプション 1 - method=xhtml に切り替える

method=xml に切り替えることができず、XSLT 2.0 パーサーを使用している場合は、method=xhtml を試すことができますか?

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

これにより、終了タグがレンダリングされます。

オプション 2 - 'div' タグに空白を追加する

<xsl:text> </xsl:text>または、 (タグの間にスペースを 1 つ挿入して)追加するだけで、<div>空ではなくなります(もちろん、スペースがあっても問題ありません)。

次の 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>
于 2013-03-08T23:57:19.540 に答える
1

私は同じ問題を抱えています。問題は、html を台無しにするだけの XmlTextWriter です。次のコードを試してください。

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());
于 2014-05-06T07:50:56.413 に答える