<xsl:value-of select="$MyVar"/>
動作しますが
<xsl:value-of select="MyDataPfath/$MyVar"/>
動作しない。
私のコードで何が間違っていますか?
<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;
}
で構文'MyDataPfath/$MyVar'を使用して値を取得することはできません。適切なパスを認識しません。$MyVarの値が「Hi」であるとします。したがって、「MyDataPfath / "Hi"」として表されます。これは、XMLから取得する有効なパスではありません。この制限を取り除くには、次のように使用できるname()またはlocal-name()関数を使用できます。または
あなたのコードは失敗しませんでした。仕様がそうすべきだと言っていることを正確に実行しました。これは、あなたが望んでいた/想像していたものとは異なりました。
あなたの希望/想像は、XPath の変数の性質に関する根本的な誤解に基づいていました。XPath 変数はマクロではありません。テキストの置換では機能しません。それらは値を表します。変数 $E に文字列 "X" が含まれている場合、MyPath/$E
は と同じことを意味しますMyPath/"X"
。これは、XPath 1.0 では無効であり、XPath 2.0 では、文字列 "X" のインスタンスを MyPath 内のノードと同じ数だけ返します。
あなたはおそらく意図したMyPath/*[name()=$E]
一見すると、達成しようとしているのは「動的評価」です。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]"/>