2010-02-08 32 views
2

從xsl樣式表創建HTML時,是否有辦法關閉XSLT編譯錯誤?如何在C#中設置XSLT以忽略錯誤

例如,對於每個html標籤都期待結束標籤。

現在最終的文檔確實有關閉標籤,但它在多個模板中,其中一個會打開,最後一個會關閉它。有沒有辦法抑制xslt編譯錯誤?

我正在使用XslCompiledTransform類。

我的XSLT文件:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <xsl:key name="categories" match="Category" use="." /> 
    <xsl:key name="client" match="Client" use="." /> 
    <xsl:key name="title" match="Title" use="." /> 

    <xsl:template match="/"> 
    <ul id="red" class="treeview-red"> 
     <xsl:for-each select="/Promotions/Promotion/Category[ 
       generate-id(.) = generate-id(key('categories', .)[1]) 
       ]"> 
     <li> 
    <span> 
     <xsl:value-of select="."/> 
    </span> 

    <ul> 
     <xsl:call-template name="category-client"> 
     <xsl:with-param name="category" select="."/> 
     </xsl:call-template> 
    </ul> 
    </li> 

    </xsl:for-each> 
    </ul> 
    </xsl:template> 

    <xsl:template name="category-client"> 
    <xsl:param name="category" /> 
    <xsl:for-each select="/Promotions/Promotion[Category=$category]/Client[ 
       generate-id(.) = generate-id(key('client', .)[1]) 
       ]"> 
     <li> 
     <span> 
      <xsl:value-of select="."/> 
     </span> 

     <ul> 


      <xsl:call-template name="category-client-title"> 
      <xsl:with-param name="category" select="$category"/> 
      <xsl:with-param name="client" select="."/> 
      </xsl:call-template> 


     </ul> 
     </li> 
    </xsl:for-each> 
    </xsl:template> 

    <xsl:template name="category-client-title"> 
    <xsl:param name="category" /> 
    <xsl:param name="client" /> 
    <xsl:for-each select="/Promotions/Promotion[Category=$category]/Title[ 
       generate-id(.) = generate-id(key('title', .)[1]) 
       ]"> 
     <li> 
    <span> 
     <xsl:value-of select="."/> 
    </span> 
     </li> 

    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

我的XML:

<Promotions> 
    <Promotion> 
    <Category>Arts &amp; Entertainment</Category> 
    <Client>Client 1</Client> 
    <Title>Get your Free 2</Title> 
    </Promotion> 
    <Promotion> 
    <Category>Arts &amp; Entertainment</Category> 
    <Client>Client 1</Client> 
    <Title>Get your Free 4</Title> 
    </Promotion> 
    <Promotion> 
    <Category>Arts &amp; Entertainment</Category> 
    <Client>Client 1</Client> 
    <Title>Get your Free 5</Title> 
    </Promotion> 
    <Promotion> 
    <Category>Community &amp; Neighborhood</Category> 
    <Client>Client 2</Client> 
    <Title>Get your Free 1</Title> 
    </Promotion> 
    <Promotion> 
    <Category>Education</Category> 
    <Client>Client 3</Client> 
    <Title>Get Your Free 3</Title> 
    </Promotion> 
</Promotions> 

我想輸出的結構是這樣的:

<ul id='red' class='treeview-red'> 
<li><span>Item 1</span> 
    <ul> 
    <li><span>Item 1.0</span> 
    <ul> 
    <li><span>Item 1.0.0</span></li> 
    </ul> 
    </li> 
    <li><span>Item 1.1</span></li> 
    <li><span>Item 1.2</span> 
    <ul> 
    <li><span>Item 1.2.0</span> 
    <ul> 
     <li><span>Item 1.2.0.0</span></li> 
     <li><span>Item 1.2.0.1</span></li> 
     <li><span>Item 1.2.0.2</span></li> 
    </ul> 
    </li> 
    <li><span>Item 1.2.1</span> 
    <ul> 
     <li><span>Item 1.2.1.0</span></li> 
    </ul> 
    </li> 
    <li><span>Item 1.2.2</span> 
    <ul> 
     <li><span>Item 1.2.2.0</span></li> 
     <li><span>Item 1.2.2.1</span></li> 
     <li><span>Item 1.2.2.2</span></li> 
    </ul> 
    </li> 
    </ul> 
    </li> 
    </ul> 
</li> 
<li><span>Item 2</span> 
    <ul> 
    <li><span>Item 2.0</span> 
    <ul> 
    <li><span>Item 2.0.0</span> 
    <ul> 
     <li><span>Item 2.0.0.0</span></li> 
     <li><span>Item 2.0.0.1</span></li> 
    </ul> 
    </li> 
    </ul> 
    </li> 
    <li><span>Item 2.1</span> 
    <ul> 
    <li><span>Item 2.1.0</span> 
    <ul> 
     <li><span>Item 2.1.0.0</span></li> 
    </ul> 
    </li> 
    <li><span>Item 2.1.1</span> 
    <ul> 
     <li><span>Item 2.1.1.0</span></li> 
     <li><span>Item 2.1.1.1</span></li> 
     <li><span>Item 2.1.1.2</span></li> 
    </ul> 
    </li> 
    <li><span>Item 2.1.2</span> 
    <ul> 
     <li><span>Item 2.1.2.0</span></li> 
     <li><span>Item 2.1.2.1</span></li> 
     <li><span>Item 2.1.2.2</span></li> 
    </ul> 
    </li> 
    </ul> 
    </li> 
    </ul> 
</li> 
<li class='open'><span>Item 3</span> 
    <ul> 
    <li class='open'><span>Item 3.0</span> 
    <ul> 
    <li><span>Item 3.0.0</span></li> 
    <li><span>Item 3.0.1</span> 
    <ul> 
     <li><span>Item 3.0.1.0</span></li> 
     <li><span>Item 3.0.1.1</span></li> 
    </ul> 

    </li> 
    <li><span>Item 3.0.2</span> 
    <ul> 
     <li><span>Item 3.0.2.0</span></li> 
     <li><span>Item 3.0.2.1</span></li> 
     <li><span>Item 3.0.2.2</span></li> 
    </ul> 
    </li> 
    </ul> 
    </li> 
    </ul> 
</li> 
</ul>"; 

在此控件的使用方法:

喜歡樣本2:

http://jquery.bassistance.de/treeview/demo/

我目前的成績,接近但不完全正確的尚未:

 <ul id="red" class="treeview-red"> 
    <li><span>Arts &amp; Entertainment</span><ul> 
     <li><span>Client 1</span><ul> 
      <li><span>Get your Free 2</span></li> 
      <li><span>Get your Free 4</span></li> 
      <li><span>Get your Free 5</span></li> 
     </ul> 
     </li> 
    </ul> 
    </li> 
    <li><span>Community &amp; Neighborhood</span><ul> 
     <li><span>Client 2</span><ul> 
      <li><span>Get your Free 1</span></li> 
     </ul> 
     </li> 
    </ul> 
    </li> 
    <li><span>Education</span><ul> 
     <li><span>Client 3</span><ul> 
      <li><span>Get Your Free 3</span></li> 
     </ul> 
     </li> 
    </ul> 
    </li> 
</ul> 

如果我能在最後

</ul> 

然後關閉該標籤會被罰款,但是當我嘗試我得到錯誤。

回答

3

這是xsllist論壇上的一個常見問題。但答案是否定的。

使用XSLT時,您不能連續思考發射的「標籤」,而是必須考慮編寫元素及其內容。所以你不要在這裏開始這裏,並且結束那裏,但是你必須打開和關閉在一起並且在別處調用干預內容。

這是一個難以理解的概念,起初它就像站在你頭上寫代碼一樣。

如果你有一個例子,它會更容易幫助。

+0

發佈爲例,我的問題 – 2010-02-08 21:47:48

0

如果你需要產生無與倫比的標籤,那麼你就可以輸出它們通過這些標籤包裹其中:

<xsl:text disable-output-escaping="yes"><![CDATA[ 
    any HTML in here will not be validated 
]]></xsl:text> 
+0

雖然可以使用禁用輸出轉義,它幾乎總是解決問題的錯誤方法。當下一步不只是默認的XML串行器時,它並不總是有效。 – lavinio 2010-02-09 07:07:29