我有以下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中实现这一目标?
谢谢和亲切的问候
答案 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
。