最近在Map过程中,遇到一个被我称为Condition Loop plus hardcode if no的问题。问题的具体描述是:在source schema中存在一个联系多次出现的节点,但是我们需要取其中一个满足一定条件的记录进行map。满足条件的记录也可以不存在,即使存在也只出现1次。问题在于即使满足条件的记录不存在,我们也需要给target record一个默认值。
这种需求用Condition Loop是难以实现的。解决的方法是使用XSLT Template,下面是一段示例代码(具体的逻辑就不解释了)。
<xsl:template name="Template_ConditionalSource">
<xsl:param name="param1" />
<xsl:variable name="cnt" select ="count(./ConditionalSource)"/>
<xsl:variable name="NoPhoneList">
<xsl:for-each select="./ConditionalSource">
<a>
<xsl:choose>
<xsl:when test="contains(string(./type/text()),$param1)">
<xsl:value-of select="'0'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'1'"/>
</xsl:otherwise>
</xsl:choose>
</a>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="mycnt" select = "sum(msxsl:node-set($NoPhoneList)/a)"/>
<xsl:variable name="bNoPhone">
<xsl:choose>
<xsl:when test="$mycnt=$cnt">
<xsl:value-of select="'true'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'false'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="VarText">
<xsl:choose>
<xsl:when test="$bNoPhone='false'">
<xsl:for-each select="./ConditionalSource">
<xsl:variable name="var:v1">
<xsl:value-of select = "string(./type/text())"/>
</xsl:variable>
<xsl:if test="contains($var:v1,$param1)">
<xsl:value-of select="$var:v1"/>
</xsl:if >
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'CondtionalRemarkText'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="VarValue">
<xsl:choose>
<xsl:when test="$bNoPhone='false'">
<xsl:for-each select="./ConditionalSource">
<xsl:variable name="var:v1">
<xsl:value-of select = "string(./type/text())"/>
</xsl:variable>
<xsl:if test="contains($var:v1,$param1)">
<xsl:value-of select="string(./value/text())"/>
</xsl:if >
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'CondtionalRemarkValue'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<Remark>
<xsl:element name="Text">
<xsl:value-of select="$VarText" />
</xsl:element>
<xsl:element name="Value">
<xsl:value-of select="$VarValue" />
</xsl:element>
</Remark>
</xsl:template>
这段脚本的核心是<xsl:variable name="mycnt" select = "sum(msxsl:node-set($NoPhoneList)/a)"/>,具体可以参见MSDN
http://msdn2.microsoft.com/en-us/library/ms256197.aspx