2015-02-17 5 views
0

Я пытаюсь проверить атрибут, который определен в схеме как тип данных Boolean. XML динамически создается, и если значение в XML равно 1, я просто хочу что-то напечатать. Но ничего не печатает.XSL Как проверить тип данных типа boolean?

Вот схема

<xs:element name="Data"> 
        <xs:complexType> 
         <xs:all minOccurs="1" maxOccurs="1"> 
         <xs:element id="variable" name="variable" type="xs:boolean" /> 
         </xs:all> 
        </xs:complexType> 
        </xs:element> 

Вот XML-

<Data> 
        <variable>1</variable> 
        <variable2>0</variable2> 
        <variable3>1</variable3> 
        </Data> 

Я пробовал различные способы. Вот то, что я попытался (я пробовал, когда и если)

<xsl:choose>   
        <xsl:when test="variable = '1'">Print something</xsl:when> 
        <xsl:when test="variable = 1">Print something</xsl:when> 
        <xsl:when test="variable = 'true'">Print something</xsl:when> 
        <xsl:when test="@variable = 1">Print something</xsl:when> 
        <xsl:when test="@variable = '1'">Print something</xsl:when> 
        <xsl:when test="@variable = true">Print something</xsl:when> 
        <xsl:otherwise> 
         <!--nothing--> 
        </xsl:otherwise> 
       </xsl:choose> 

        <xsl:if test="variable = '1'">Print something</xsl:if> 
        <xsl:if test="variable = 'true'">Print something</xsl:if> 

Мой XSL начинается с этой

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
+1

Пожалуйста, обеспечивают минимальные, но полные образцы из XML, XSLT и вывода, которые вы получаете, и того, который вы хотите разрешить для воспроизведения проблемы. http://xsltransform.net/bFDb2Cj работает как ожидалось для меня. –

+3

Контекст - это все в XSLT. Тесты 'variable = 1' и' variable = '1'' должны работать как _provided_, текущий узел контекста - это элемент 'Data', _ и _ нет пространств имен. Является ли это полным XML или это всего лишь фрагмент целого, и если это фрагмент, имеет ли элемент предка декларация пространства имен по умолчанию ('xmlns =" ​​... "')? –

+0

To @IanRoberts. Я не уверен, что вы имеете в виду, но нет пространства имен. Он начинается только с

ответ

1

Первая вещь: если вы не используете схемы-Aware процессор, это не реально независимо от того, что говорит ваша схема.

Далее, если вы используете процессор XSLT 2.0, как и ваша таблица стилей объявляет, то вы можете увидеть, если значение является истинным или ложным, применяя следующий тест:

test="xs:boolean(value)" 

Например, учитывая следующее тест ввода:

XML

<Data> 
    <variable>1</variable> 
    <variable>0</variable> 
    <variable>true</variable> 
    <variable>false</variable> 
</Data> 

и применяя следующую таблицу стилей:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
exclude-result-prefixes="xs"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/Data"> 
    <result> 
     <xsl:for-each select="variable"> 
      <xsl:copy> 
       <xsl:choose>   
        <xsl:when test="xs:boolean(.)">Print something</xsl:when> 
        <xsl:otherwise> 
         <!--nothing--> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:copy> 
     </xsl:for-each> 
    </result> 
</xsl:template> 

</xsl:stylesheet> 

произведет следующий результат :

<?xml version="1.0" encoding="UTF-8"?> 
<result> 
    <variable>Print something</variable> 
    <variable/> 
    <variable>Print something</variable> 
    <variable/> 
</result> 

, который соответствует тому, что XML Schema определяет в качестве допустимых значений для логического типа данных.


Вы действительно используете процессор XSLT 2.0?

У меня есть веские основания сомневаться в том, что: ваша таблица стилей также объявляет пространство имен Microsoft:

xmlns:msxsl="urn:schemas-microsoft-com:xslt" 

и AFAIK нет процессоров Microsoft XSLT 2.0.

Чтобы выполнить тот же тест в XSLT 1.0, вам нужно будет сделать:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/Data"> 
    <result> 
     <xsl:for-each select="variable"> 
      <xsl:copy> 
       <xsl:choose>   
        <xsl:when test="number(.) or .='true'">Print something</xsl:when> 
        <xsl:otherwise> 
         <!--nothing--> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:copy> 
     </xsl:for-each> 
    </result> 
</xsl:template> 

</xsl:stylesheet> 

Если вы можете быть уверены, что значение variable будет всегда быть только 1 или 0, то вы можете сократить тест на:

<xsl:when test="number(.)"> 
Смежные вопросы