2016-10-04 12 views
-2

と条件チェックを複雑:プロセスは、私はのようなXMLファイルを持っているXSLT 1.0

<root> 
    <node ID="1" /> 
    <node ID="2" /> 
    <node ID="3" /> 
    <node ID="4" /> 
    <node ID="5" /> 
    <node ID="6" /> 
    <node ID="7" get="1" /> 
    <node ID="8" get="1 & 3" /> 
    <node ID="9" get="(2 | 23) & 3" /> 
    <node ID="10" get="((2 | 3) & 1) & 15" /> 
</root> 

は、第二のための最初の6つのノードを無視します。私のXSLTはノード7-10を処理しています。 私がしたいのは、ノードが存在するかどうかと数式に基づいて真または偽になる式として「取得」を「処理する」ことです。&logical andであり、|logical orである。

そこで、例えば:ノード1は、ノード1とノード3の両方が

  • ノード9がのでtrueを返すであろう存在するため
  • ノード8 XLSTがtrueを返すであろう存在するので

    • ノード7 XSLTは真を返すことになりますノード2とノード3は、ノード15は、
    存在しないため、ノード23が原因or
  • ノード10がfalseを返すことになるていなくても(存在します

    純粋なXSLT 1.0でこれを行うにはどうしますか?

    get値の形式を変更することができます。他の形式があれば、自分がしたいことをより簡単に行うことができます。

    私がチェックしたいノード(この場合は7-10)のgetの値を、式を「処理」して真または偽を返す関数に送信する必要があると仮定します。

  • +0

    :あなたの入力XMLにそれを適用すると、次のような結果になります 'GET'属性の名前は、* *検索を示唆まだブールコネクタの使用は、*論理示唆します評価*。どちらですか?あなたの例は検索を示唆していますが、検索する項目の単なる区切り記号として扱うことで、 'と'の論理的性質を否定します。さらに、あなたの例は論理 'または'を無視します - あなたはどのように "得る"でしょうか? 4? – kjhughes

    +0

    パラメータ名 'get'は何でもかまいません。私はちょうど簡単にするためにそれを '取得'と呼んでいます。アイデアは、XSLTが現在ノード7を見ているということです。ノードのID値に基づいてノードを取得するために、 'get'パラメータの式を使用します。より良いアイデアを提供するために、ノード7の例を更新しました。 – IMTheNachoMan

    +0

    あなたはまだ '' 2 ''を得る方法を指定していません。 4 'とは異なります。 – kjhughes

    答えて

    0

    それが重要ならば、それは簡単に私がやりたいてあげる 他のいくつかの形式がある場合、私はget値のフォーマットを変更することができます。まあ

    、あなたがそのようget値を再フォーマットする場合:

    1. 論理AND andとして書かれています。
    2. 論理和はorと書かれています。
    3. は、各ノードは、代わりにちょうどそのID番号で、node[@ID=N]と呼ばれる

    あなたの入力XMLは、実際にこのようになりますよう:

    XML

    <root> 
        <node ID="1" /> 
        <node ID="2" /> 
        <node ID="3" /> 
        <node ID="4" /> 
        <node ID="5" /> 
        <node ID="6" /> 
        <node ID="7" get="node[@ID=1]" /> 
        <node ID="8" get="node[@ID=1] and node[@ID=3]" /> 
        <node ID="9" get="(node[@ID=1] or node[@ID=23]) and node[@ID=3]" /> 
        <node ID="10" get="((node[@ID=2] or node[@ID=1]) and node[@ID=1]) and node[@ID=15]" /> 
    </root> 
    

    あなたに次のスタイルシートを適用できます。

    XSLT 1。

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    
    <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/> 
    
    <xsl:template match="/root"> 
        <axsl:stylesheet version="1.0"> 
        <axsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
        <axsl:template match="/root"> 
         <output> 
          <xsl:for-each select="node[@get]"> 
           <result ID="{@ID}"> 
            <axsl:value-of select="boolean({@get})"/> 
           </result> 
          </xsl:for-each> 
         </output> 
        </axsl:template> 
        </axsl:stylesheet> 
    </xsl:template> 
    
    </xsl:stylesheet> 
    

    0は、この結果を受け取るために:

    <?xml version="1.0" encoding="UTF-8"?> 
    <axsl:stylesheet xmlns:axsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
        <axsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
        <axsl:template match="/root"> 
         <output> 
         <result ID="7"> 
          <axsl:value-of select="boolean(node[@ID=1])"/> 
         </result> 
         <result ID="8"> 
          <axsl:value-of select="boolean(node[@ID=1] and node[@ID=3])"/> 
         </result> 
         <result ID="9"> 
          <axsl:value-of select="boolean((node[@ID=1] or node[@ID=23]) and node[@ID=3])"/> 
         </result> 
         <result ID="10"> 
          <axsl:value-of select="boolean(((node[@ID=2] or node[@ID=1]) and node[@ID=1])and node[@ID=15])"/> 
         </result> 
         </output> 
        </axsl:template> 
    </axsl:stylesheet> 
    

    この結果は、有効なXSLTスタイルシートです。あなたがプログラミングについて尋ねる前に、あなたの要件を再考する必要が

    <?xml version="1.0" encoding="UTF-8"?> 
    <output> 
        <result ID="7">true</result> 
        <result ID="8">true</result> 
        <result ID="9">true</result> 
        <result ID="10">false</result> 
    </output> 
    
    +0

    これは素晴らしいです。どうもありがとうございます! – IMTheNachoMan

    関連する問題