我正在尝试将 xsl 变量中的值分配给 xml 文件中的新节点。此代码有效,但当“lbi:GetCooperatives(PVAL)”的值为空时添加一个空的 PROP/PVAL 节点:
<xsl:template match="PROP" mode="Geocode">
<PROP NAME="Geocode">
<PVAL>
<xsl:value-of select="lbi:GetCoordinates(PVAL)"/>
</PVAL>
</PROP>
</xsl:template>
由于我不需要任何空节点,因此我尝试仅在“lbi:GetCooperatives(PVAL)”的值不为空时添加新节点。我尝试的方法是将值分配给变量并测试该变量,如下所示。不幸的是,当我这样做时,即使 lbi:GetCooperatives(PVAL) 返回非空值,我也没有得到新的 PROP 节点。
<xsl:template match="PROP" mode="Geocode">
<xsl:variable name="coords" select="'lbi:GetCoordinates(PVAL)'"/>
<xsl:if test="not(string-length(coords) = 0)">
<PROP NAME="Geocode">
<PVAL>
<xsl:value-of select="coords"/>
</PVAL>
</PROP>
</xsl:if>
</xsl:template>
谁能指出我正确的方向,或者提出更好的方法来实现这一目标?
源xml是这样的:
<RECORD>
<PROP name="PostCode">
<PVAL>N11 1NN</PVAL>
</PROP>
</RECORD>
模板的引用如下:
<xsl:template match="RECORD">
<xsl:copy>
<xsl:apply-templates select="PROP[@NAME='PostCode']" mode="Geocode"/>
</xsl:copy>
lbi:GetCoordinates() 方法位于作为 xml 命名空间添加的外部 .Net 程序集中。
使用这种方法有效:
<xsl:template match="PROP[string-length(lbi:GetCoordinates(PVAL))>0]" mode="Geocode">
<PROP NAME="Geocode">
<PVAL>
<xsl:value-of select="lbi:GetCoordinates(PVAL)"/>
</PVAL>
</PROP>
现在的问题是,当 lbi:GetCooperatives 方法只需要调用一次时,它会被调用两次,源 xml 可能有 100,000 多个需要地理编码的元素,因此这并不简单。这表明我之前使用的 xsl:variable 表达式不正确,并且该变量始终以空结尾。