簡體   English   中英

使用XSLT輸出一個空的HTML textarea元素

[英]Using XSLT to output an empty HTML textarea element

嘗試輸出空的textarea元素時,.NET XSLT處理器將元素折疊為其簡短形式。 而不是這個:

<textarea id="blah" name="blah"></textarea>

我明白了:

<textarea id="blah" name="blah"/>

這導致許多Web瀏覽器(包括IE和Firefox)呈現頁面的其余部分,就像它是textarea的內容一樣 這很糟糕。

我可以強制XSLT處理器輸出開始和結束textarea標簽,如果我在中間放置一些像不間斷的空間。 但這意味着我必須在客戶端進行更多的解析和驗證,以告知textarea何時“真正”為空。 我還必須使用JavaScript來刪除額外的空間,以便用戶不用空格開始他們的注釋。

有沒有人知道強制XSLT處理器呈現開始和結束標簽不必插入虛擬內容的方法?

通過類似的問題右側找到答案在這里上Stackoverflow.com :-)

以下是MSDN的進一步說明。

我必須使用虛擬內容,這是我使用的xsl:模板,在textarea中只有換行符。

<!-- This prevents empty textarea elements being rendered as singletons in the XHTML output by adding a newline character -->
<xsl:template name="xhtml-textarea-contents">
    <!-- what should be contained in the textarea -->
    <xsl:param name="contents" />

    <xsl:choose>
        <xsl:when test="$contents = ''"><xsl:text>&#x0A;</xsl:text></xsl:when>
        <xsl:otherwise><xsl:copy-of select="$contents" /></xsl:otherwise>
    </xsl:choose>
</xsl:template>

如果要生成xml或html,可以在textarea中編寫換行符,然后使用jquery將其刪除。

這是jQuery的一個例子:

<textarea>&#160;<textarea>

<script>
 $(document).ready(function(){
    $('textarea').each(
      function(index){$(this).text('');}
     );
  });
</script>

我在.net之外遇到過這個問題,在<xsl:output method="xml"><xsl:output method="xhtml">中可以重現[對我而言](我假設method="html"不適用於我們的情況,其中輸出必須是格式良好的xml)

為了避免textarea標記崩潰,我們必須在其中插入一些內容,但我們還必須避免篡改實際內容。 下列:

<xsl:if test="not(normalize-space())"><xsl:comment></xsl:comment></xsl:if>

產生正確的結果(即防止空textarea自動關閉並且不引入人工內容)。 我相信在post-schema-validation信息集的節點構造中的規范中提到了這種行為,其中空注釋的字符串值將變為零長度字符串; 然而,對於下午的輕松閱讀來說,文件的措辭也是如此。

進一步推動它( 所以如果它不篡改內容,我們真的需要xsl:if ),這是防止某些標簽崩潰的最終模板(我渴望遵循身份轉換模式):

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="textarea">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        <xsl:comment></xsl:comment>
    </xsl:copy>
</xsl:template>

注意:瀏覽器的行為表明這種轉換也應該應用於其他一些元素,比如段落。 然而,擁有一個自我關閉的<p/>並不像擁有一個自我關閉<textarea/>一樣具有破壞性!

Chris Ballance有一個對我有用的答案。 但值得注意的是,我一直在使用輸出到流的XslCompiledTransform重載,如下所示:

XslCompiledTransform transform = new XslCompiledTransform();
...
MemoryStream stream = new MemoryStream();
transform.Transform(reader, args, stream);

為了傳遞正確的設置,我不得不使用接受XmlWriter的重載。

// using XmlWriter so I can pass the output settings along.
XmlWriter writer = XmlWriter.Create(stream, transform.OutputSettings);
transform.Transform(reader, args, writer);

微軟在那里使用了一種非常奇怪的設計模式。

我遇到了類似的問題,並且意識到如果將XmlWriterSettings的ConformanceLevel設置為Fragment,它會消除一些XslCompiledTransform怪癖。

FileStream xmlFileStream = File.Create("file.xml");
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("transform.xsl");
XmlWriterSettings settings = new XmlWriterSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlWriter xmlWriter = XmlWriter.Create(xmlFileStream, settings);
transform.Transform(sourceXml, null, xmlWriter);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM