2010-11-21 4 views
1

В файле .xml, я так:проблема с выходом XSLT

<function>true</function> 

В схеме Ile, я определил его как логическое значение. Итак, теперь он работает правильно. НО для XSLT-файл, т.е. .xsl,

+0

Можете ли вы добавить пример xsl, описывающий то, что вы хотите сделать? – wimh

+0

PLZ проверить обновленную часть – user507087

+0

Хороший вопрос, +1. См. Мой ответ для полного и короткого решения, которое не использует никаких условных инструкций XSLT. Также дождитесь еще более короткого взлома, приходя ... :) –

ответ

3

Вы можете использовать xsl:choose:

<td> 
    <xsl:choose> 
    <xsl:when test="function = 'true'">@</xsl:when> 
    <xsl:otherwise>&#32;</xsl:otherwise> 
    </xsl:choose> 
</td> 
+0

его не работает ... и 32 - это что?/Это ошибка? – user507087

+0

@ user507087 - извините, он должен быть сущностью для пространства (' '). Я пропустил #. – Oded

+0

Этот объект пространства будет удален из таблицы стилей. – 2010-11-22 23:40:21

0

Это можно сделать очень просто, вообще не требует условных инструкций XSLT и полностью в духе XSLT (нажимной стиль):

Это преобразование:

<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="function/text()[.='true']">@</xsl:template> 
<xsl:template match="function/text()[not(.='true')]"> 
    <xsl:text> </xsl:text> 
</xsl:template> 

<xsl:template match="function"> 
    <td><xsl:apply-templates/></td> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на следующий документ XML:

<function>true</function> 

производит разыскиваемого, правильный результат:

<td>@</td> 

Когда же преобразование применяется на следующий документ XML:

<function>false</function> 

снова правильно, хотел результат получается:

<td> </td> 

Наконец, используя хак (в XSLT 2.0/XPath 2.0 это не обязательно), мы можем использовать только один шаблон:

<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="function"> 
    <td> 
    <xsl:value-of select= 
    "concat(substring('@', 1 div (.='true')), 
      substring(' ', 1 div not(.='true')) 
     ) 
    "/> 
    </td> 
</xsl:template> 
</xsl:stylesheet> 
+0

Я думаю, что использование условных выражений лучше, чем писать условие дважды. – svick

+0

@svick: Альтернатива, которую вы считаете лучшей, намного ниже (вероятно, близка к нулю) composabitiy. Кроме того, он имеет значительно большую сложность и значительно более подвержен ошибкам. –

Смежные вопросы