XSLT - 即使没有元素也会迭代集合

时间:2015-03-02 15:55:19

标签: xml xslt

我有以下XSL文件:

<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>

逻辑很简单:给定一个ADDRESSES的输入文件,我想得到每个地址的租用数据。

我的实现的问题是,如果没有节点“RENTED_FLATS”,那么它将不会进入循环内部,但我要求,如果有一个没有RENTED_FLATS的地址,它仍然必须出现在带有元素的输出中FLOOR空。

如何在XSL中实现这一目标?

谢谢和亲切的问候

1 个答案:

答案 0 :(得分:1)

我会通过将for-each替换为apply-templates,并为具有ADDRESS的{​​{1}}元素定义不同的模板来解决此问题。那些那些没有的人。

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