2015-03-02 76 views
0

我有以下XSL文件:XSLT - 遍歷集合即使沒有元素

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="/EMPLOYEE"> 
    <ROOT> 
     <xsl:for-each select="ADDRESSES"> 
     <xsl:variable name="ADDRESSES" select="." /> 
     <xsl:for-each select="RENTED_FLATS"> 
      <xsl:variable name="RENTED_FLATS" select="." /> 
      <xsl:element name="RENT_DATA"> 
       <xsl:element name="ADDRESS"> 
       <xsl:value-of select="$ADDRESSES/LINE1" /> 
       </xsl:element> 
       <xsl:element name="FLOOR"> 
       <xsl:value-of select="$RENTED_FLATS/FLOOR" /> 
       </xsl:element> 
      </xsl:element> 
     </xsl:for-each> 
    </ROOT> 
    </xsl:template> 
</xsl:stylesheet> 

的邏輯很簡單:給定的地址的輸入文件,我想每個租賃數據地址。

我的實現的問題是,如果沒有節點「RENTED_FLATS」,那麼它不會進入循環內,但我需要,如果有一個地址沒有RENTED_FLATS,它仍然必須出現在元素FLOOR爲空。

我該如何在XSL中實現?

感謝和親切的問候

回答

1

我會用apply-templates更換的for-each的用途,並定義爲那些ADDRESS元素RENTED_FLATS和那些那些沒有不同的模板處理這個。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="/EMPLOYEE"> 
    <ROOT> 
     <xsl:apply-templates select="ADDRESSES"/> 
    </ROOT> 
    </xsl:template> 

    <xsl:template match="ADDRESSES[RENTED_FLATS]"> 
    <xsl:apply-templates select="RENTED_FLATS"/> 
    </xsl:template> 

    <!-- template for addresses that don't match the more specific one above --> 
    <xsl:template match="ADDRESSES"> 
    <RENT_DATA> 
     <ADDRESS><xsl:value-of select="LINE1" /></ADDRESS> 
     <FLOOR/> 
    </RENT_DATA> 
    </xsl:template> 

    <xsl:template match="RENTED_FLATS"> 
    <RENT_DATA> 
     <ADDRESS><xsl:value-of select="../LINE1" /></ADDRESS> 
     <FLOOR><xsl:value-of select="FLOOR" /></FLOOR> 
    </RENT_DATA> 
    </xsl:template> 
</xsl:stylesheet> 

還要注意,我用文字結果元素,而不是在該元素的名稱是固定的情況下xsl:element - 你只需要xsl:element當名稱必須動態計算。