0
<xsl:value-of select="$MyVar"/>

動作しますが

<xsl:value-of select="MyDataPfath/$MyVar"/>

動作しない。

私のコードで何が間違っていますか?


タンジェントを見つけたら、次のように回転クォートを取得できます。(参照: Ogre3D Vector3.cpp)

    public static Quaternion getRotationTo(Vector3 src, Vector3 dest)
    {
        Quaternion q = new Quaternion();

        src.Normalize();
        dest.Normalize();

        double d = Vector3.Dot(src, dest);

        if (d >= 1.0f)
        {
            return Quaternion.Identity;
        }

        if (d < (1e-6f - 1.0f))
        {
            //                   // Generate an axis
            //                   Vector3 axis = Vector3::UNIT_X.crossProduct(*this);
            //                   if (axis.isZeroLength()) // pick another if colinear
            //                       axis = Vector3::UNIT_Y.crossProduct(*this);
            //                   axis.normalise();
            //                   q.FromAngleAxis(Radian(Math::PI), axis);

            // Generate an axis
            Vector3 axis = Vector3.Cross(Vector3.UnitX, src);

            if (axis.Length() == 0.0f)
            {
                axis = Vector3.Cross(Vector3.UnitY, src);
            }

            axis.Normalize();

            q = Quaternion.CreateFromAxisAngle(axis, MathHelper.ToRadians(180));
        }
        else
        {
            //               Real s = Math::Sqrt( (1+d)*2 );
            //               Real invs = 1 / s;

            //               Vector3 c = v0.crossProduct(v1);

            //               q.x = c.x * invs;
            //               q.y = c.y * invs;
            //               q.z = c.z * invs;
            //               q.w = s * 0.5;
            //               q.normalise();

            Double s = Math.Sqrt((1 + d) * 2);
            Double invs = 1 / s;

            Vector3 c = Vector3.Cross(src, dest);

            q.X = (float)(c.X * invs);
            q.Y = (float)(c.Y * invs);
            q.Z = (float)(c.Z * invs);
            q.W = (float)(s * 0.5);
            q.Normalize();

        }


        return q;
    }
4

3 に答える 3

0

で構文'MyDataPfath/$MyVar'を使用して値を取得することはできません。適切なパスを認識しません。$MyVarの値が「Hi」であるとします。したがって、「MyDataPfath / "Hi"」として表されます。これは、XMLから取得する有効なパスではありません。この制限を取り除くには、次のように使用できるname()またはlocal-name()関数を使用できます。または

于 2012-06-28T09:28:29.260 に答える
0

あなたのコードは失敗しませんでした。仕様がそうすべきだと言っていることを正確に実行しました。これは、あなたが望んでいた/想像していたものとは異なりました。

あなたの希望/想像は、XPath の変数の性質に関する根本的な誤解に基づいていました。XPath 変数はマクロではありません。テキストの置換では機能しません。それらは値を表します。変数 $E に文字列 "X" が含まれている場合、MyPath/$Eは と同じことを意味しますMyPath/"X"。これは、XPath 1.0 では無効であり、XPath 2.0 では、文字列 "X" のインスタンスを MyPath 内のノードと同じ数だけ返します。

あなたはおそらく意図したMyPath/*[name()=$E]

于 2012-06-26T08:50:19.903 に答える
0

一見すると、達成しようとしているのは「動的評価」です。XSLT はデフォルトで XPath の動的評価をサポートしていないため、拡張関数を使用する必要があります。

XSLT プロセッサによっては、EXSLT 拡張機能を確認する必要がある場合があります。特にhttp://www.exslt.org/dyn/index.htmlの動的モジュール。これにより、このようなことができるようになります

<xsl:value-of select="dyn:evaluate('MyDataPfath/$MyVar')"/> 

ただし、あなたの場合、おそらく $MyVar には単一の要素名しか含まれていません。その場合、コマンドを次のように変更できます。これは、拡張機能なしで機能します

<xsl:value-of select="MyDataPfath/*[local-name() = $MyVar]"/>
于 2012-06-26T08:05:32.510 に答える