Основная проблема со следующим оператором if:
<xsl:if test="Record/FieldValue/@fieldName='dtrk_sysid' and Record/FieldValue/@fieldValue!='0'">
<xsl:value-of select="Record/FieldValue/@fieldValue"/>
</xsl:if>
состоит в том, что @fieldValue, который вы пытаетесь сравнить после and
, должен быть @fieldValue <FieldValue>
, чье @fieldName равно 'dtrk_sysid', но ничто не ограничивает второе сравнение этим частный <FieldValue>
. <xsl:if test=...>
не устанавливает контекст. <xsl:value-of>
затем выберет атрибут first @fieldValue для всех узлов Record / FieldValue в узле контекста, который, к счастью, является правильным, в вашем входном XML-образце (но может быть не всегда?) .
Чтобы это исправить, вы можете захватить контекст (<FieldValue>
, @fieldName которого равен 'dtrk_sysid') в переменной:
<xsl:variable name="fvsys" select="(Record/FieldValue[@fieldName = 'dtrk_sysid'])[1]"/>
Тогда вы можете заменить первые два оператора if на:
<xsl:choose>
<xsl:when test="$fvsys/@fieldValue != '0'">
<xsl:value-of select="$fvsys/@fieldValue"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>12343</xsl:text>
</xsl:otherwise>
</xsl:choose>
(Выше было изменено, чтобы соответствовать поведению, описанному в комментариях.)
Вы можете заменить свой третий оператор if на:
<xsl:value-of select="(Record/FieldValue[@fieldName = 'date_modified'])[1]/@fieldValue"/>
Это ничего не выдаст, если такого FieldValue не существует.
Если после этого вы все еще не получаете желаемый результат, сообщите нам, какой выход вы получаете, и чем он отличается от желаемого результата.