2012-06-18 29 views
3

可變我已經把下面的xsl分配在XSLT

<Root> 
    <child> 
     <Book name="Title" value="hailey" /> 
     <Book name="Title" value="After death" /> 
     <Book name="Price" value="100" /> 
    </child> 
    <child> 
     <Book name="Title" value="After death" /> 
     <Book name="genre" value="fiction" /> 
    </child> 
</Root> 

我想通過「子」節點,如果「標題」的出現(ATLEAST一次)迭代,我希望有一個變量是組。我使用下面的代碼在XSLT

<xsl:variable name="flag"> 
     <xsl:for-each select="/Root/Child" > 
      <xsl:for-each select="./Book" > 
        <xsl:if test="./@name = 'Title'"> 
        <xsl:value-of select="'true'"/>      
       </xsl:if> 
      </xsl:for-each> 
     </xsl:for-each> 


</xsl:variable> 

問題是我的價值,如果變量「標誌」中設置爲「truetruetrue」,而我希望它只是「真」。任何幫助表示讚賞

+0

抱歉耽擱,這對我來說非常有用。非常感謝 ! – parameswar

+0

parameswar:不客氣。 –

回答

7

根本不需要迭代或條件指令。只要使用此一班輪

<xsl:variable name="vYourName" select="boolean(/Root/Child/Book[@name='Title'])"/> 

對於這個特定的XML文檔這可以表示更短

<xsl:variable name="vYourName" select="boolean(/*/*/*[@name='Title'])"/> 

說明

兩種定義都定義了一個名爲變量"vYourName"true()恰好當至少一個Root/Child/Book元件具有Title屬性。

請注意

  1. 根據定義,功能boolean($ NS)返回true,當且僅當節點集$ns非空。

  2. 布爾值true()的字符串表示形式是字符串"true"

更新

在評論中,OP問:

如果有ATLEAST一個出現時是在那裏的,該 「價值」 分配辦法變量?

答案:是的,如果以 「價值」 你的意思是第一value屬性,使用:

<xsl:variable name="vYourName" select="(/*/*/*[@name='Title'])[1]/@value"/> 
+0

正如在我的回答中指出的那樣,沒有「標題」屬性 – freefaller

+0

@freefaller:感謝您指出這一點 - 相應地修復了答案。 –

+0

如果有至少一個發生,有沒有辦法將該值賦值給變量? – parameswar

0

未經測試(和修訂得益於盧塞羅評論)...

<xsl:variable name="flag"> 
    <xsl:if test="count(/Root/Child/Book[@name='Title'])>0">true</xsl:if> 
</xsl:variable> 
+0

在示例中沒有屬性標題... – Lucero

+0

確認,是的,你是正確的@Lucero – freefaller

+0

如果標題沒有出現在第一層次,變量值設置爲空 – parameswar

0
<xsl:variable name="flag"> 
    <xsl:if test="/Root/Child/Book/@name = 'Title'"> 
     <xsl:value-of select="'true'"/>      
    </xsl:if> 
</xsl:variable> 
+0

這隻會檢查樹的第一層次結構。 – parameswar

+0

@parameswar不,它檢查完整的樹的路徑 - XPath是這樣工作的。 – Lucero

0

如果你喜歡你的代碼堅持可以使用

<xsl:variable name="flag"> 
    <xsl:for-each select="//Book" > 
     <xsl:if test="@name = 'Title'"> 
      <xsl:value-of select="'true'"/> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:variable>