0

私の XML には次の行が含まれています。<PV1.18> の値が「INR」の場合、子タグ <PV1.2>IN</PV1.2> を追加したいと考えています。

<PV1>
  <PV1.1>0001</PV1.1>
  <PV1.3>
    <PL.1>5N</PL.1>
    <PL.2>0552</PL.2>
    <PL.3>0B</PL.3>
  </PV1.3>
  <PV1.8>INR</PV1.8>
  <PV1.19>
    <CX.1>000002194171</CX.1>
  </PV1.19>
</PV1>

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

<PV1>
  <PV1.1>0001</PV1.1>
  <PV1.2>IN</PV1.2>
  <PV1.3>
    <PL.1>5N</PL.1>
    <PL.2>0552</PL.2>
    <PL.3>0B</PL.3>
  </PV1.3>
  <PV1.8>INR</PV1.8>
  <PV1.19>
    <CX.1>000002194171</CX.1>
  </PV1.19>
</PV1>

XSLT で試したコードは次のとおりです。しかし、それは機能しません:

<xsl:template match="PV1">
  <xsl:choose>
    <xsl:when test="PV1.18 eq 'INR'">
      <PV1.2>IN</PV1.2>
    </xsl:when>
  </xsl:choose>
</xsl:template>
4

1 に答える 1

1

提供した xslt テンプレートを見ると、 PV1.2要素が追加されないだけでなく、既存のすべての要素にコピーするコードがあるため、何も出力されません。

とにかく、これはタイプミスかもしれませんが、現在のテンプレートはPV1.18を探していますが、XML には何もありません。XML サンプルでは、​​おそらくPV1.8はPV1.18にすべきだと思います。(ここでは「eq」ではなく「=」を使用する必要があるとも思います)。ただし、理想的には、これはxsl:chooseでチェックすべきではありません(特にxsl:otherwiseがない場合) が、テンプレート マッチでチェックを行う必要があります。

<xsl:template match="PV1[PV1.18 = 'INR']">

次に、テンプレート内で、既存の PVI1 要素をコピーし、PV1.2要素を作成して、子も出力する必要があります。

このXSLTを試してください

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="PV1[PV1.18 = 'INR']">
      <xsl:copy>
         <xsl:apply-templates select="PV1.1"/>
         <PV1.2>IN</PV1.2>
         <xsl:apply-templates select="*[not(self::PV1.1)]"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

ここで注意すべき主なことは、Identity Transform を使用することです。これは、他のすべての要素をそのままコピーするため、変換する必要があるもののテンプレートのみが必要です。PV1.1の後にPV1.2を挿入しないように見えるため、ここには 2 つのxsl:apply-templatesがあります。

PV1.18 = 'INR' を持たないPV1要素の場合、ID テンプレートがすべての作業を行い、出力は入力と同じになります。

于 2013-10-10T21:08:42.973 に答える