0

私は2つのXMLフラグメントを持つXMLを持っています.1つ目は、新しい値を適用する必要があるフラグメントです(かなり複雑な要素を持つことができます)

... some static parents
<a:element1>
   <a:subelement tag="someString">
      <a:s1>a</a:s1>
   </a:subelement>
</a:element1>
<a:element2>b</a:element2>
<a:element3>c</a:element3>
... lots of other elements like the above ones

最初の XML から生成された XPath と新しい値を含む 2 番目のフラグメント。

<field>
   <xpath>/Parent/element1/subelement[@tag="someString"]/s1</xpath>
   <newValue>1</newValue>
</field>
<field>
   <xpath>/Parent/element2</xpath>
   <newValue>2</newValue>
</field>

最初のフラグメントのすべての要素に適用する新しい値がない場合があります。

XPath によって示される場所に新しい値を適用する必要がある XSLT 変換を作成するのに苦労しています。

出力は次のようになります。

... some static parents
<a:element1>
   <a:subelement tag="someString">
      <a:s1>1</a:s1>
   </a:subelement>
</a:element1>
<a:element2>2</a:element2>
... lots of other elements like the above ones

動的 xpath を評価するために xalan:evaluate にアクセスできます。私はさまざまな解決策を試しています。それらが意味を成し始めたら、ここに書きます。

アプローチのアイデアは好評です。ありがとう

4

1 に答える 1

0

沖、私はその方法を見つけたので、ここに答えを書きます。おそらく誰かがこれを必要とするでしょう:

<xsl:template match="/">

<!-- static parents -->
  <a:Root>
    <xsl:apply-templates select="/a:Root/a:Parent" />
  </a:Root>

</xsl:template>

<xsl:template match="@*|*|text()">

<xsl:variable name="x" select="generate-id(../.)" />
<xsl:variable name="y" select="//field[generate-id(xalan:evaluate(xpath)) = $x]" />

<xsl:choose>
  <xsl:when test="$y">
    <xsl:value-of select="$y/newValue" />
  </xsl:when>
  <xsl:otherwise>
    <xsl:copy>
        <xsl:apply-templates select="@*|*|text()" />
    </xsl:copy>
  </xsl:otherwise>
</xsl:choose>

</xsl:template>

変換を説明するには、静的な部分を書き留めてから、興味のあるフラグメントで apply-templates を呼び出します。これは流動的な構造を持っています。

次に、変更したいテキストに自分自身を配置する場合を除いて、ソースからターゲット ( /a:Root/a:Parentフラグメントから開始) にすべてをコピーする、わずかに変更された恒等変換を使用しています。

私が興味を持っている text() は、2 番目のフラグメントで見つかった xpath 文字列によって参照される要素を親( ../ . )として持ちます。変数xは、whenのコンテキストでは、この要素を意味します。

変数yは、 xalanを使用して評価された場合にx変数が関連する同じ要素を参照するxpath要素を子として持つフィールド要素を見つけます。ここで、物理要素を比較するためにgenerate-id()を使用しました。そうしないと、要素のtoStringによって比較されます (これは間違っています)。変数yが存在しない場合は、この要素に対して変更された可能性のあるxpath要素がないことを意味し、そのままにしておきます。y変数が存在する場合、そこからnewValueを取得できます現在、更新したいテキストの要素に配置されています。

于 2013-06-14T08:42:17.103 に答える