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>

这里要注意的主要事情是使用身份转换,它将按原样复制所有其他元素,因此您只需要模板来处理需要转换的内容。这里有两个xsl:apply-templates,因为看起来您不会在PV1.1之后插入PV1.2

PV1元素没有 PV1.18 = 'INR' 的情况下,标识模板会完成所有工作,并且输出将与输入相同。

于 2013-10-10T21:08:42.973 回答