我正在尝试将xsl变量的值赋给xml文件中的一个新节点。这段代码可以工作,但是当"lbi:GetCoordinates(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:GetCoordinates(PVAL)”的值不为空时添加新节点。我尝试的方法是将该值分配给一个变量并测试该变量,如下所示。不幸的是,即使“lbi:GetCoordinates(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:GetCoordinates方法被调用了两次,但实际上只需要调用一次。源xml可能有100,000多个需要进行地理编码的元素,因此这是一个非常棘手的问题。这表明我之前使用的xsl:variable表达式是不正确的,变量始终为空。
lbi:GetCoordinates()
函数返回什么 -- 请具体说明。 - Dimitre Novatchev