2010-11-20 4 views
2

У меня есть XML-схема с элементом определенным из хза типа: булева как это:Сравнение значения xs: boolean в XSLT?

<xs:element name="useful" 
       minOccurs="1" maxOccurs="1" 
       type="xs:boolean"/> 

Я пытаюсь использовать выбрать/когда/в противном случае блока в XSL для вывода что-то конкретное на основе стоимости что, как это:

<xsl:choose> 
    <xsl:when test="@useful = 0">No</xsl:when> 
    <xsl:otherwise>Yes</xsl:otherwise> 
</xsl:choose> 

Я перепробовал все изменения я могу думать для этого сравнения (с использованием истинно(), ложные(), 1, 0, удаление @, используя // @) и его всегда печатает «Да». Что я здесь делаю неправильно?

EDIT (по просьбе Мартина Honnen):

Вот пример XML, который используется:

<?xml version="1.0"?> 
<functions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="functions.xsd"> 
    <function> 
     <name>func1</name> 
     <useful>0</useful> 
    </function> 

    <function> 
     <name>func2</name> 
     <useful>1</useful> 
    </function> 
</functions> 

Это вызывает проблемы с помощью XSL: шаблон Я думаю, поэтому я использую XSL : для каждого цикла для каждой функции и для вывода чего-то конкретного для каждого полезного тега. xsl: шаблон можно использовать только на верхнем уровне xslt, правильно?

Полный файл XSLT является

<?xml version='1.0' ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <html><body> 
     <h2>Functions</h2> 
      <table border="1"> 
       <tr> 
        <th>Functions</th> 
        <th>Useful</th> 
       </tr> 
       <xsl:for-each select="functions/function"> 
        <tr> 
        <td> 
         <xsl:value-of select="name"/> 
        </td> 
        <td> 
         <xsl:choose> 
          <xsl:when test="@useful = 0">No</xsl:when> 
          <xsl:otherwise>Yes</xsl:otherwise> 
         </xsl:choose> 
        </td> 
        </tr> 
       </xsl:for-each> 
      </table> 
     </body></html> 
     </xsl:template> 
</xsl:stylesheet> 
+0

Хороший вопрос, +1. См. Мой ответ для полного решения. –

ответ

3

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

<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> 

В XS LT 2.0 (Schema-Aware процессор), вам необходимо импортировать схему (используйте <xsl:import-schema>), то вы можете просто использовать:

('no', 'yes')[number(useful)+1] 

где текущий узел является родителем useful элемента.

1

Вашей схема определяет элемент с именем «полезным», но схема не имеет значения вообще, если вы не пытаетесь использовать схему осведомленной XSLT 2.0.

Выполнение @useful в XPath выбирает атрибут этого имени контекстного узла, который не имеет никакого смысла с вашей схемой, поскольку это определяет элемент. Так покажите нам свой экземпляр XML-XSLT является обработкой, то мы можем показать вам некоторые XSLT код:

<xsl:template match="useful"> 
    <xsl:choose> 
    <xsl:when test=". = 'false' or . = 0">No</xsl:when> 
    <xsl:otherwise>Yes</xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

С схемой-Aware XSLT 2.0 вы могли бы сделать

<xsl:template match="useful"> 
    <xsl:value-of select="if (data(.)) then 'Yes' else 'No'"/> 
</xsl:template> 
Смежные вопросы