Я пытаюсь присвоить значение из переменной xsl новому узлу в моем XML-файле.Этот код работает, но добавляет пустой узел PROP / PVAL, когда значение «lbi: GetCoordinates (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)» не является пустым.Подход, который я пытаюсь сделать, - это присвоить значение переменной и проверить ее, как показано ниже.К сожалению, когда я делаю это, я не получаю новых узлов PROP, даже когда lbi: GetCoordinates (PVAL) возвращает непустое значение.
<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 () во внешней сборке .Net добавлен в виде пространства имен xml.
Использование этого подхода работает:
<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, которое я использовал ранее, неверно и переменная всегда заканчивается как пустая.