2015-03-02 75 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当名称必须动态计算。