0

次のような XML が与えられた場合:

<a>
  <b>
    <c>some keyword</c>
  </b>
</a>

ノードcにテキスト「キーワード」が含まれている場合に備えて、aの親ノードに新しいノードを追加する必要があるため、次のようになります

<a>
  <b>
    <c>some keyword</c>
  </b>
</a>
<x> new node X </x>

テキストを式と一致させることができます:

<xsl:template match="//a/b/c[matches(text(),'\.*keyword\.*')]">
  <xsl:copy-of select="."/>
  <xsl:element name="x">
    <xsl:text> new node </xsl:text>
  </xsl:element>
</xsl:template>

そして、これは

<a>
  <b>
    <c>some keyword</c>
    <x> new node X </x>
  </b>
</a>

どうすれば修正できますか?

4

1 に答える 1

1

の親xを照合しながら要素を追加する必要があります。a述語内の任意の子要素または属性を参照できます。私が言いたいのは、コピー中に親の中身をのぞき見る必要があるということです。a、b、または c 要素をコピーしているときにそれを行うのは遅すぎます。

次のスタイルシートでうまくいくはずです。現在、XSLT2.0 対応のプロセッサを持っていないので確認できませんが、ロジックは確認できるはずです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
    <xsl:element name="{name()}">
        <xsl:apply-templates ></xsl:apply-templates>
    </xsl:element>
</xsl:template>
<xsl:template match="//*[matches(a/b/c/text() , 'keyword')]">
    <xsl:element name="{name()}">
        <xsl:apply-templates ></xsl:apply-templates>
        <xsl:element name="x">
            <xsl:text> new node </xsl:text>
        </xsl:element>
    </xsl:element>
</xsl:template>

于 2012-06-06T20:26:18.107 に答える