2010-08-16 47 views
1

我想對XML文件的各個節點執行檢查,並根據特定節點的內容執行某些操作,例如,如果類型爲bool,則顯示覆選框或者類型爲文本顯示一個textarea或一個下拉選項框。在XSL中執行檢查

例如:

<Questions> 
<Question> 
<Data>What gender are you?</Data> 
<Type>pulldown</Type> 
</Question> 
<Question> 
<Data>Do you like Chocolate?</Data> 
<Type>checkbox</Type> 
</Question> 
</Questions> 

在此先感謝

林不知道我是否應該使用xsl:choose/xsl:whenxsl:if

+0

非常好的問題(+1)。請參閱我的答案,以獲得您想要的「XSLT方式」 - 這是處理不同類型節點的最簡單和推薦的方法,並且不需要任何硬編碼的條件邏輯。 :) – 2010-08-16 16:25:45

回答

3

<xsl:choose>可以並且應該總是儘可能避免

這XSLT轉換演示瞭如何處理不同Question類型以不同的方式,沒有任何硬連線條件邏輯

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="Question[Type='pulldown']"> 
    <!-- Implement pull-down here --> 
</xsl:template> 

<xsl:template match="Question[Type='checkbox']"> 
    <!-- Implement checkbox here --> 
</xsl:template> 
</xsl:stylesheet> 

<xsl:choose>應該因被aboided來,使我們在OOP避免同樣的原因switch(type)語句並使用虛函數。這使代碼更短,減少了出錯的可能性,極大地擴展和維護,甚至在編寫代碼之前支持未來的代碼。

+0

+1。是的,「模式匹配」是使用聲明性語言的方式。 – 2010-08-16 19:54:32

+0

爲什麼要避免xsl:choose? – Julio 2010-08-17 08:33:31

+0

@Dan:''xsl:choose'應該遵循,因爲我們在OOP中避免使用'switch(type)'語句並使用虛函數。這使代碼更短,減少了出錯的可能性,極大地擴展和維護,甚至在編寫代碼之前支持未來的代碼。 – 2010-08-17 12:34:16

1

似乎是最適合您的需求結構是xsl:choose

<xsl:template match="Question"> 
<xsl:choose> 
    <xsl:when test="Type = 'checkbox'"> 
     <!-- output checkbox code --> 
    </xsl:when> 
    <xsl:when test="Type = 'pulldown'"> 
     <!-- output pulldown code --> 
    </xsl:when> 
    <xsl:otherwise> 
     <!-- output default code --> 
    </xsl:otherwise> 
</xsl:choose> 
</xsl:template> 
+0

對不起,這只是一個錯字 – Julio 2010-08-16 16:03:55

+0

@丹 - 足夠公平:) – Oded 2010-08-16 16:06:13