如果另一个childtag在XSLT中有特定字符串,我们如何添加子标记?

时间:2013-10-10 18:43:38

标签: xml xslt

我的XML包含以下几行。我想添加一个子标签< PV1.2> IN< /PV1.2>如果< PV1.18>具有值“INR”。

<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>

1 个答案:

答案 0 :(得分:1)

查看您提供的xslt模板,不仅不会添加 PV1.2 元素,它根本不输出任何内容,因为它有任何代码可以复制所有现有元素

无论如何,这可能是一个错字,但当前模板正在寻找 PV1.18 ,而XML中没有。我想在您的XML示例中 PV1.8 应该 PV1.18 。 (我也认为你应该在这里使用'='而不是'eq')。理想情况下,这应该检查不应该在 xsl:choose (特别是当你没有 xsl:否则)时,你应该检查一下模板匹配

<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,它将按原样复制所有其他元素,因此您只需要模板来处理需要转换的内容。此处有两个 xsl:apply-templates ,因为您似乎不会在 PV1.1 之后插入 PV1.2

如果 PV1 元素没有PV1.18 ='INR',那么身份模板会完成所有工作,输出将与输入相同。