2011-12-05 10 views
4

属性の1つと等しい文字列があるかどうかをチェックしたいと思います。例:XML - 属性の1つと等しい文字列

<rules> 
     <mother cat="pp"> 
      <daughter cat="pr"/> 
      <daughter cat="np"/> 
     </mother> 
     <mother cat="wp"> 
      <daughter cat="rp"/> 
      <daughter cat="vp"/> 
     </mother> 
     <mother cat="cn"> 
      <daughter cat="jj"/> 
      <daughter cat="cn"/> 
     </mother> 
     <mother cat="np"> 
      <daughter cat="jj"/> 
      <daughter cat="np"/> 
     </mother> 
    </rules> 

「pp」が母親のcat属性のいずれかと等しいかどうかをテストするだけです。 この例では、そうです。しかし、それは "pr"のために間違っているはずです。

ありがとうございます。

答えて

3

は、次の式を使用します

/*/mother[@cat='pp'] 

この式は値ppに等しいcatという名前の属性を有するmother要素を返します。

xsl:ifのテスト式では、このノードが存在する場合はtrueが返されます。 false、そうでなければ。例えば:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <xsl:if test="/*/mother[@cat='pp']">NODE EXISTS</xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

このスタイルシート印刷ようなノードがソースに存在する唯一NODE EXISTS

は、次の式を使用して、この要素の位置を探す:

count(/*/mother[@cat='pp']/preceding-sibling::*)+1 
+0

とどのように私は、PPのために例えばその母親の位置を見つけることができるそれが1でなければなりません私は、カウント先行兄弟が、didntの仕事を試してみました.. – Ataman

+0

@ user446141 - このようなもの: 'count(/ */mother [@ cat = 'pp']/preceding-sibling :: *)+ 1.'。参照:http://stackoverflow.com/questions/226405/find-position-of-a-node-using-xpath –

1

このXPath構文は、あなたのケースのために働くだろう...

//mother[@cat='pp'] 

それはcat属性に値「PP」を持っている任意のmotherノードを返します。それ以外の場合、テストしていた場合

//mother[@cat='pr'] 

次に空のノードセットが返されます。

1

この:@cat = 'pp'と、少なくとも1枚のマザーがある場合

<xsl:if test="//mother[@cat = 'pp']"> 
    <xsl:message terminate="no"> 
    Exists! 
    </xsl:message> 
</xsl:if> 

Exists!を印刷します。

0

"pp"が母親の猫 属性のいずれかと等しいかどうかをテストするだけです。

良い質問、+1。 "pp"はそれが子供である、mother要素のcat属性の文字列値に等しいがあるときこれは場合には、正確にtrue()と評価さ

/*/mother/@cat = 'pp' 

:他のすべての存在の回答より

簡素XML文書の最上位要素の

この例でははいです。しかし、それは "pr"のために間違っているはずです。もう一度

は、評価:以下
/*/mother/@cat = 'pr' 

がアクションでこれを示す単純な変換である:提供されるXML文書
に適用

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    /*/mother/@cat = 'pp' is <xsl:text/> 
    <xsl:value-of select="/*/mother/@cat = 'pp'"/> 

    /*/mother/@cat = 'pr' is <xsl:text/> 
    <xsl:value-of select="/*/mother/@cat = 'pr'"/> 
</xsl:template> 
</xsl:stylesheet> 

<rules> 
    <mother cat="pp"> 
     <daughter cat="pr"/> 
     <daughter cat="np"/> 
    </mother> 
    <mother cat="wp"> 
     <daughter cat="rp"/> 
     <daughter cat="vp"/> 
    </mother> 
    <mother cat="cn"> 
     <daughter cat="jj"/> 
     <daughter cat="cn"/> 
    </mother> 
    <mother cat="np"> 
     <daughter cat="jj"/> 
     <daughter cat="np"/> 
    </mother> 
</rules> 

指名手配、正しい結果がが生成されます

/*/mother/@cat = 'pp' is true 

    /*/mother/@cat = 'pr' is false 
関連する問題