2010-11-20 18 views
2

Ben türü xs tanımlanan bir eleman ile bir xml şema vardır: Böyle boolean:Bir xs karşılaştırması: XSLT'deki boole değeri?

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

G/aksi değerine göre belirli çıkış şeye XSL engellemek zaman/seçim kullanmaya çalışıyorum o karşılaştırma için aklıma gelen her varyasyonu denedim

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

onu (@ // kullanarak, @ kaldırarak, 0, 1,) (,) (doğru yanlış kullanarak) ve: böyle, o her zaman 'Evet' yazdırır. Burada neyi yanlış yapıyorum? (Martin Honnen talebi ile)

DÜZENLEME: İşte

kullanılmakta olan XML örneği verilmiştir:

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

Bu xsl sorunlara neden olur: şablon Ben bu yüzden Xsl kullanıyorum düşünüyorum : Her bir işlevin birbirine döngü yapması ve her yararlı etiket için belirli bir şey çıkarmaya çalışmak. xsl: şablon sadece xslt'nin üst seviyesinde kullanılabilir, doğru mu?

tam XSLT dosyası

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

İyi soru, +1. Tam bir çözüm için cevabımı görün. –

cevap

3

Ben şema tanımlar düşünüyorum

şema farkında XSLT 2.0 ile
<xsl:template match="useful"> 
    <xsl:choose> 
    <xsl:when test=". = 'false' or . = 0">No</xsl:when> 
    <xsl:otherwise>Yes</xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

bunu yapabilirsiniz: Öyleyse size bazı XSLT kodunu gösterebilir XSLT işleme olduğunu bize örnek XML göstermek Bir öğe, ancak bir özniteliğin değerini test ediyorsunuz - bu sizin ana probleminiz olabilir.

<xsl:choose> 
    <xsl:when test="@useful = 0">No</xsl:when> 
    <xsl:otherwise>Yes</xsl:otherwise> 
</xsl:choose> 
I ( //@ kullanarak, @ çıkarma true(), false(), 1, 0, kullanarak) O karşılaştırma için bir aklınıza gelebilecek her varyasyonu denedim ve her zaman 'yazdırır

Evet'. Ne burada yanlış yapıyorum?

Büyük olasılıkla cari düğüm useful adında bir nitelik olan bir unsur değildir.

XSLT 1'de nasıl çalışılır.useful eleman türü ile 0 şeması tarafından tanımlandığı gibi

Bu dönüşüm, aşağıdaki XML belgesi uygulanır
<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> 

: istenen, doğru sonucu üretilir

<t> 
    <useful>true</useful> 
    <useful>false</useful> 
    <useful>1</useful> 
    <useful>0</useful> 
</t> 

:

XS'de

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

geçerli düğüm useful elemanının ebeveyni burada: LT 2.0 (Şema-farkında işlemci), siz (<xsl:import-schema> kullanın) o zaman basitçe kullanabilirsiniz şema ithalat gerekir.

1

Kişisel şema "yararlı" adlı bir elemanı tanımlanmıştır ancak XSLT 2.0 farkında şema kullanmaya çalışıyorsanız sürece şema hiç alakalı olmamasıdır.

XPath içinde @useful yapmak, bir bağlam öğesini tanımladığından, sahip olduğunuz şema ile ilgili bir anlam ifade etmeyen bağlamsal düğümün bu adının bir özniteliğini seçer.

<xsl:template match="useful"> 
    <xsl:value-of select="if (data(.)) then 'Yes' else 'No'"/> 
</xsl:template>