2016-10-24 3 views
1

xml以下の値を取得する方法を知りたいと思います。私はいくつかのアプローチを試してみましたが、正しい解決策が見つからないようです。XSLT値は複数のタグとその値に基づいて選択します

<a> 
    <aid>ok</aid> 
    <b> 
     <bid>ok</bid> 
     <c> 
      <cid>ok</cid> 
      <d> 
       <dValue>goal</dValue> 
      </d> 
     </c> 
    </b> 
</a> 

条件が基準を下回る満たしている必要があります。

  • <a><aid>値は
  • OKであれば<a><b><c><cid>値は
  • OKであれば<a><b><bid>値は
  • OKであれば、私は<a><b><c><d><dValue>
  • の値を必要とします

私はすでにこれについて数時間を費やしてきたので、どんな助けでも大歓迎です:)ああ、私はxslt 2.0を使用しています。

答えて

3
<xsl:value-of select="a[aid='ok']/b[bid='ok']/c[cid='ok']/d/dValue"/> 
+0

<x> <xid>ok</xid> <y> <yid>ok</yid> <z> <zid>ok</zid> <t> <dValue>goal2</dValue> </t> </z> </y> </x> 

は再びたかっ正しい結果を生成します。私は遠くはなかったが、私は括弧で間違っていたので、私の試みで何も見つからなかった。ありがとう – Matjaz

1

より一般的なタスク

要素の名前は重要ではありませんし、パス(ネストされた要素の数)の深さはいずれかのことができますが、子供のように持っている場合「ID」を付加した親の名前を命名し、このXPath 2.0の式は、現在のものを含め、すべてのそのような場合には、希望の結果をproduses:

//dValue[every $anc in ../ancestor::* 
      satisfies $anc/*[name() eq concat($anc/name(), 'id')]/string() eq 'ok' ]/string() 

XSLT 2.0検証

<a> 
    <aid>ok</aid> 
    <b> 
     <bid>ok</bid> 
     <c> 
      <cid>ok</cid> 
      <d> 
       <dValue>goal</dValue> 
      </d> 
     </c> 
    </b> 
</a> 

それは式を評価し、この評価結果出力:

goal 

この変換が提供されるXML文書に適用され

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

    <xsl:template match="/"> 
    <xsl:sequence select= 
    "//dValue[every $anc in ../ancestor::* 
     satisfies $anc/*[name() eq concat($anc/name(), 'id')]/string() eq 'ok' ]/string()"/> 
    </xsl:template> 
</xsl:stylesheet> 

このXML文書に同じ変換を適用する:最初の試みで働いていた

goal2 
+0

でも、それは良い解決策です、それは私の場合は過剰なようです。しかし、それが将来必要なのであれば、感謝します。 – Matjaz

+2

@Matjaz、XPath 2.0ソリューションが必要だったので、これを書いています:) –

関連する問題