0

xpath1.0で次のxpath選択を使用しています

<xsl:variable name="id"><xsl:value-of select="./@id" /></xsl:variable>
preceding::exm:messageFlow[@sourceRef = $id]/@targetRef

これは非常にうまく機能し、私が望んでいたことを正確に実行しました。ただし、XSLT2.0をxPath2.0と組み合わせて使用​​し始めましたが、これは機能しなくなりました(Altova XMLプロセッサを使用)。次のエラーが発生します。

Kann nicht mit Ziel-Typ besetzt werden-Aktuelles Element ist'sid-B3FD7EE5-043 3-4939-A69F-E74B30FDEB1C' vom Typ xs:untypedAtomic、Typ xs:QName erwartet-=

これは大まかに次のように解釈されます。

target-typeに設定できません-現在の要素は、タイプxs:untypedAtomic、タイプxs:QNameが必要な'sid-B3FD7EE5-0433-4939-A69F-E74B30FDEB1C'です-

以前、私はこの選択で同様の問題を抱えていました:

following::exm:*[exm:incoming = $out] | preceding::exm:*[exm:incoming = $out]

これもxpath1.0で機能しましたが、xPath2.0で同様のエラーを返しました。

following::exm:*[exm:incoming/text() = $out] | preceding::exm:*[exm:incoming/text() = $out]

xPath2.0でも機能しました。属性で似たようなことをしてみましたが、うまくいきませんでした

対応するXMLの小さな抜粋:

<messageFlow id="sid-80B618A4-E6BF-4438-AF5D-5111AD308FE6" name="" sourceRef="sid-B3FD7EE5-0433-4939-A69F-E74B30FDEB1C" targetRef="sid-6EB2DB76-CC19-48AD-A073-D37C7489F211"/>
<task completionQuantity="1" id="sid-B3FD7EE5-0433-4939-A69F-E74B30FDEB1C" isForCompensation="false" name="call service" startQuantity="1">
     <incoming>sid-2B2BA651-B5BA-4195-9B5B-E6855B1138F4</incoming>
     <incoming>sid-DA4B86E8-C3F2-497C-8C0D-218E95CE9FD1</incoming>
     <outgoing>sid-008948DE-BA59-4897-AC37-2C3AA63DCD82</outgoing>
</task>
4

2 に答える 2

1

問題を再現できません。

この変換:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="task">
    <xsl:variable name="id"><xsl:value-of select="./@id" /></xsl:variable>

    <xsl:variable name="vResult"
     select="preceding::messageFlow[@sourceRef = $id]/@targetRef"/>

    <xsl:value-of select="$vResult"/>
 </xsl:template>
</xsl:stylesheet>

次のドキュメントに適用した場合(提供されたフラグメントは単一の最上位要素にラップされ、未定義の名前空間がすべて取り除かれます):

<t>
    <messageFlow id="sid-80B618A4-E6BF-4438-AF5D-5111AD308FE6"
    name="" sourceRef="sid-B3FD7EE5-0433-4939-A69F-E74B30FDEB1C"
    targetRef="sid-6EB2DB76-CC19-48AD-A073-D37C7489F211"/>
    <task completionQuantity="1" id="sid-B3FD7EE5-0433-4939-A69F-E74B30FDEB1C"
    isForCompensation="false" name="call service" startQuantity="1">
         <incoming>sid-2B2BA651-B5BA-4195-9B5B-E6855B1138F4</incoming>
         <incoming>sid-DA4B86E8-C3F2-497C-8C0D-218E95CE9FD1</incoming>
         <outgoing>sid-008948DE-BA59-4897-AC37-2C3AA63DCD82</outgoing>
    </task>
</t>

Altova2011 と Saxon 9.1.07 の両方で実行すると、期待どおりの正しい結果が生成され、エラーは発生しません:

sid-6EB2DB76-CC19-48AD-A073-D37C7489F211
于 2012-07-26T12:54:17.910 に答える
1

@id 属性を QName 型として宣言するスキーマはありますか?

この変数宣言では:

<xsl:variable name="id"><xsl:value-of select="./@id" /></xsl:variable>

新しい結果ツリー フラグメントに @id 属性のコピーを作成しています。これはまったく不要です。変数を単に既存の属性への参照にすることで、ほぼ確実にニーズが満たされるでしょう。

<xsl:variable name="id" select="@id" />

コピーを作成することで、不要なコードを記述し、不要なランタイム コストが発生するだけでなく (新しいツリーの構築はコストのかかる操作です)、型情報も失われます。@id が xs:QName 型であるという私の推測が正しければ、原子化後の変数 $id は xs:untypedAtomic 型になり、それを xs:QName と比較すると、引用されたものと同様のメッセージで失敗する可能性があります。 .

于 2012-07-26T22:18:31.210 に答える