у меня есть атрибут xml dsc:
<DMD dsc = "1">
В схеме
<xs:attribute name = "dsc" type = "xs:boolean" use = "required"/>
Я хочу изменить значение «0» на «нет» и «1» на «да».
Мой xslt:
<td style = "padding-left:10px; width:1.64in; ">
<xsl:for-each select = "@dsc">
<span style = "color:#0024c0; ">
<xsl:value-of select = "string(.)"/>
</span>
</xsl:for-each>
</td>
Я попробовал xsl: template match и xsl: choose, но у меня все еще нет решения. Я могу преобразовывать элементы, но не атрибут. Спасибо
XPath @dsc
верен, если вы находитесь в контексте элемента DMD
, но он не виден из-за частичного размещенного вами XSL.
Если вы не в контексте DMD
, xpath будет whatever/elements/DMD/@dsc
.
Однако сокращенная форма .
предназначена для текущего элемента. Насколько мне известно, вы не можете использовать это для получения значения атрибута.
И я не понимаю, зачем вы делаете цикл с xsl:for-each
. Есть только один атрибут dsc
.
проверьте этот код
<td style = "padding-left:10px; width:1.64in; ">
<xsl:for-each select = "//@dsc">
<span style = "color:#0024c0; ">
<xsl:choose>
<xsl:when test = "//@dsc='1'"><xsl:text>yes</xsl:text></xsl:when>
<xsl:otherwise><xsl:text>no</xsl:text></xsl:otherwise>
</xsl:choose>
</span>
</xsl:for-each>
</td>
он работает, но элемент DMD имеет maxOccurs без привязки <xs: element name = "DMD" type = "DMDType" minOccurs = "0" maxOccurs = "unbounded" />. Когда у меня есть один элемент, все в порядке, наконец, у меня есть «да», когда атрибут равен «1». Но когда у меня более одного элемента DMD, все атрибуты имеют значение «да», несмотря на то, что некоторые из них имеют значение «0».
Вы можете попробовать следующую таблицу стилей, в которой используется шаблоны для замены всех вхождений атрибута dsc
соответствующими значениями:
<?xml version='1.0'?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output indent = "yes" omit-xml-declaration = "yes" />
<!-- identity template - copy all (other) nodes as given -->
<xsl:template match = "node()|@*">
<xsl:copy>
<xsl:apply-templates select = "node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Replace '1' attribute values with 'yes' values -->
<xsl:template match = "@dsc[.='1']">
<xsl:attribute name = "dsc">
<xsl:value-of select = "'yes'"/>
</xsl:attribute>
</xsl:template>
<!-- Replace '0' attribute values with 'no' values -->
<xsl:template match = "@dsc[.='0']">
<xsl:attribute name = "dsc">
<xsl:value-of select = "'no'"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
В моем xslt есть шаблон перед тегом <html>: <xsl: template match = "/"> Я добавил Ваш код после </ xsl: template> в конце xslt, но теперь xslt не конвертирует значение, но "0" или «1» просто исчезла из визуализации. Поле пустое.
Порядок шаблонов не имеет значения в XSLT, важно то, какие шаблоны выполняются. Попробуйте добавить <apply-templates />
в свой шаблон <html>. Или покажите большую часть реального кода.
Вы предоставили слишком мало кода для минимальный воспроизводимый пример. Таким образом, люди, пытающиеся ответить, должны будут размышлять о том, чего вы действительно ожидаете, чтобы получить достойный ответ. Без дополнительной информации ответы будут основаны на определенных предположениях.