2016-12-13 22 views
0

我遇到了一個問題,我不知道如何解決它。如果已經有類似的問題,我找不到,請將鏈接發給我。xsl:template中的循環槽paramteres每當有空時都會執行某些操作

我有一個xml文件,其中包含一些信息,屬於一個創建的圖。我可以用xslt提取所有我想要的變量。爲了把它們打印到另一個文件我調用不同的模板和發送變量給它:從我的主要XSLT文件 例如一些代碼:

<xsl:call-template name="HostDefine"> 
     <xsl:with-param name="variable1" select="@value1"/> 
     <xsl:with-param name="variable2" select="path/node/@value2"/> 
     <xsl:with-param name="variable3" select="path/node/@value3"/> 
     <xsl:with-param name="variable4" select="@value4"/> 
     <xsl:with-param name="variable5" select="@value5"/> 
     <xsl:with-param name="variable6">value6</xsl:with-param> 
</xsl:call-template> 

在大多數模板,我有辦法超過6個參數。

我這樣調用在另一個XSL文件模板:

<xsl:template name="HostDefine"> 
    <xsl:param name="Variable1"/> 
    <xsl:param name="Variable2"/> 
    <xsl:param name="Variable3"/> 
    <xsl:param name="Variable4"/> 
    <xsl:param name="Variable5"/> 
    <xsl:param name="Variable6"/> 
</xsl:template> 

關閉模板之前,現在我想打印的所有變量到新的文件中這樣說:

o=<xsl:value-of select="$Variable1"/> 
p=<xsl:value-of select="$Variable2"/> 
q=<xsl:value-of select="$Variable3"/> 
r=<xsl:value-of select="$Variable4"/> 
s=<xsl:value-of select="$Variable5"/> 
t=<xsl:value-of select="$Variable6"/> 

那我的結構。現在我的問題是,這些變量中的一些可能是空的。只要它們是空的,它們就不應該被打印出來(也不是「o =/p =/q =/...」。所以我需要詢問模板裏的某個地方如果一個變量有一個值或者它是空的我認爲我只能做到這一點與節點。我想一種for循環(或在xslt一個增量 - 調用),但比我不能循環通過不同的參數。因此,我現在看到的唯一方法是做一個if-調用befor每個變量,看看它是否爲空,但有時超過20個變量在一個模板和大約10個模板中,這將是一個非常巨大的東西。是否有更優雅/更好的方式來做到這一點?

我真的會讚賞你的幫助謝謝

+0

定義「空」。如果你有'',那麼結果可以是空節點集(XSLT 1.0)或序列(XSLT 2.0)值「屬性或可以是具有單個屬性節點的節點集或序列。在這種情況下,您總是可以檢查'boolean($ variable1)'來檢查節點集或序列是否爲空。但是, value6是不同的,您設置的值是結果樹片段或臨時樹。 –

+0

如果它是空的,則xml-File中的節點中沒有「值」屬性。但是,當xml文件的節點中沒有「值」屬性時,將其手動設置爲空字符串或空白('')不會成爲問題。 我的目標是創建一個乾淨的結構化代碼。我可以去任何一種看起來很好的方式。 這是否回答了這個問題。我不知道我是否完全瞭解它。 – SmartProjection

+0

是XSLT 1.0還是2.0?你總是通過所有聲明的參數,或者做你的陳述「在大多數模板中,我有超過6個參數」表明你可能聲明瞭超過6個參數,但有時候傳遞的參數比聲明的參數少。 –

回答

0

如果我們談論的是通過節點集在XSLT 1.0,那麼你可以聲明<xsl:param name="param-name" select="/.."/>確保默認值是一個空節點集合,然後你可以檢查

<xsl:if test="$param-name"> 
    ... = <xsl:value-of select="$param-name"/> 
</xsl:if> 

檢查非空節點集已通過。

該方法適用於所有前五個示例,其中您使用帶有XPath表達式選擇節點的select屬性定義傳遞的參數值。

對於帶有<xsl:with-param name="variable6">value6</xsl:with-param>的示例,您傳遞了一個從不爲空的結果樹片段,因此boolean($variable6)檢查不適用於該方法。

+0

因此,您可以在模板('name ='/ ('')?在這些行的每一行('o = ')你會把 這是我認爲這將是真正的不雅和大的選項,但如果你說這是一個好的,我會嘗試這樣的 – SmartProjection

+0

該參數的聲明在模板內部必須發生,我沒有看到使用參數的方式沒有聲明它們。無論你需要所有這些參數和命名模板,我不知道,你沒有顯示任何輸入樣本,任何具體的模板我肯定不會爲所有這些屬性選擇使用參數'select =「@ value1」',我會根據需要簡單地選擇模板中的屬性,只要不存在不同節點所需的不同選擇。 –

+0

謝謝。因爲我需要檢查大量數據(至少它是爲我而設),所以我在安靜地思考這件事,因爲我的案件很安靜。 我試着用默認值聲明它的建議。它不適合我用'select =「/ ..」'但是用'select =「''」'這是可能的。 我仍在思考如何使用參數進行管理(我把它計算在一個模板中,它必須超過45個參數)。 感謝您的幫助。 – SmartProjection

相關問題