2009-07-13 11 views
4

私はXML文書と、いくつかの属性をタイプとして定義している関連スキーマを持っています。XPathでブール値ノードを選択する方法は?

@attribute='true' or @attribute='1' 

または

@attribute='false' or @attribute='0' 
xs:booleanための字句値が truefalse1、および 0なので、それは正しく特定のブール値を持つ属性を選択しているようだ私のような何かを書く必要があるだろう

これは詳細です。

boolean(@attribute)のような機能が期待できますが、booleanの機能には異なるセマンティクスがあります。

良い方法がありますか?これは、スキーマを意識したプロセッサが役立つだろうか?

答えて

5

フィルとTomalakによって提案された解決策に加えて、私は、XPath 2.0は、いくつかの選択肢を提供することを発見:

@attribute=('true','1') 
string(@attribute) cast as xs:boolean 

をそして最後に、XPath 2.0のがあれば、すべてがあることを意味し、スキーマ認識処理を提供していはアライメントで、あなたが書くことができる必要があります:

data(@attribute) 

しかし、スキーマ対応のプロセッサがで来るのは難しいようです。最も人気のあるものはsaxonの非自由商業用の変種で、300ポンドの費用がかかります。今のところ私は@attribute=('true','1')を使っています。

1

オプションは、使用しているXPathプロセッサによって異なる場合があります。たとえば、Microsoftのものでは、 "ブール値(@属性)"パターンを実装するために使用できるJavaScript関数を定義することができます。他のエンジンで同様のサポートが利用可能かどうかはわかりません。

それ以外の場合は、「true」と「1」の両方をチェックする必要があると思われます。

うまくいけば、他の誰かが良い答えを持っていることを望みます。

1

XPathだけを使用すると、あなたが提案する表現は、それが得られるほど近くにあります。同じチェックを行うにはさまざまな方法がありますが、そのすべてがより長く複雑な表現になり、より多くの意図を隠すでしょう。

私はスキーマ認識プロセッサはないと思いますが、XMLスキーマはXSLTに接続されておらず、プロセッサIMHOへのサポートを構築することはあまり意味がありません。言語が定義され、拡張機能は機能を追加する標準的な方法です。

使用するライブラリがEXSL拡張機能をサポートしている場合は、関数にブールチェックを抽象化するための半可搬性のメカニズムを記述するか、同じMSXSLのようなベンダー固有の拡張を使用できます。

私はあなたが持っている表現にとどまることをお勧めします。それは複雑ではなく、ほんの少し冗長です。

0

私は冗長チェックを行い、レガシーシステムを扱うために必要に応じてそれを微調整する単純な名前付きテンプレートを使用します(例えば、いくつかのフィールドは "Y"/"N"、 "True"/"False" 0)、値を変数にダンプします。最も洗練されたアプローチではありませんが、XPath 1を使用している場合はそうです。0、EXSLTサポートを持たず、外部のスクリプト呼び出しを利用できない(またはしたくない)場合は、一貫して動作し、必要に応じて調整することができます。

<xsl:template name="CleanupBool"> 
    <xsl:param name="val" /> 
    <xsl:choose> 
     <xsl:when test="$val='1'">1</xsl:when> 
     <xsl:when test="$val='true'">1</xsl:when> 
     <xsl:when test="$val='True'">1</xsl:when> 
     <xsl:when test="$val='TRUE'">1</xsl:when> 
     <xsl:when test="$val='T'">1</xsl:when> 
     <xsl:when test="$val='Y'">1</xsl:when> 
     <xsl:otherwise>0</xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

使用法:

<xsl:variable name="enabled"> 
    <xsl:call-template name="CleanupBool"> 
     <xsl:with-param name="val" select="IS_ENABLED"/> 
    </xsl:call-template> 
</xsl:variable> 
1

は、次のXPath式を試してみてください。

[@attribute=true()] 
0

@attribute cast as xs:booleanはそれについて移動する良い方法です。