2010-11-20 11 views
2

私は型xsの定義された要素を持つXMLスキーマを持っています。このようにブール値:XSLTのxs:boolean値を比較していますか?

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

それを(@ //使用して、@を削除し、0、1、)(、)(真偽を使用)、このように、その常に「はい」と表示されます。私はここで間違って何をしていますか?

EDIT(マーティンHonnenからのリクエストによって):ここで

が使われているXMLのサンプルです:テンプレートは、私は思うので、私は、XSLを使用しています:

<?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を使用するときに問題を引き起こします:for-eachは各関数をループし、有用なタグごとに固有のものを出力しようとします。 xsl:templateは、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()10、 を使用して)私は比較のための を考えることができるすべてのバリエーションを試したのだが、プリントアウトし、常に はい'。私は何ですか ここで間違っていますか?

ほとんどの場合、現在のノードは、usefulという名前の属性を持つ要素ではありません。

ここではXSLT 1での作業方法を示します。useful要素タイプ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="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

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

現在のノードがuseful要素の親です:LT 2.0(スキーマを意識したプロセッサ)、あなたは、あなたが簡単に使用することができます(<xsl:import-schema>を使用)スキーマをインポートする必要があります。

1

あなたのスキーマが「役に立つ」という名前の要素を定義していますが、XSLT 2.0意識スキーマを使用しようとしている場合を除き、スキーマは全く関係ありませんです。

XPathで@usefulを実行すると、要素を定義するスキーマで意味を持たないコンテキストノードのその名前の属性が選択されます。 だから、XSLTが処理している、我々はあなたにいくつかのXSLTコードを表示することができます私達にあなたのインスタンスのXMLを示しています。

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

スキーマ対応のXSLT 2.0を使用すると、

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