Я думаю, что схема определяет элемент, но вы проверяете значение атрибута - это может быть вашей главной проблемой.
<xsl:choose>
<xsl:when test="@useful = 0">No</xsl:when>
<xsl:otherwise>Yes</xsl:otherwise>
</xsl:choose>
Я перепробовал все варианты
для этого сравнения (используя
true()
, false()
, 1
, 0
,
удаляя @
, используя //@
), и это
всегда печатает «Да». Что я
здесь делаешь неправильно?
Скорее всего, текущий узел не является элементом с атрибутом с именем useful
.
Вот как работать в XSLT 1.0 с типом элемента useful
, как определено схемой:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="useful/text()[. = 'true' or .='1']">
Yes
</xsl:template>
<xsl:template match="useful/text()[. = 'false' or .='0']">
No
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к следующему документу XML :
<t>
<useful>true</useful>
<useful>false</useful>
<useful>1</useful>
<useful>0</useful>
</t>
желаемый, правильный результат выдается :
<t>
<useful>
Yes
</useful>
<useful>
No
</useful>
<useful>
Yes
</useful>
<useful>
No
</useful>
</t>
В XSLT 2.0 (процессор с поддержкой схемы) вам необходимо импортировать схему (используйте <xsl:import-schema>
), тогда вы можете просто использовать:
('no', 'yes')[number(useful)+1]
где текущий узел является родителем элемента useful
.