Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如果另一个childtag在XSLT中有特定的字符串,我们如何添加一个子标记?_Xml_Xslt - Fatal编程技术网

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

Xml 如果另一个childtag在XSLT中有特定的字符串,我们如何添加一个子标记?,xml,xslt,Xml,Xslt,我的XML包含以下几行。如果值为“INR”,我想在中添加一个子标记 0001 5N 0552 0B 印度卢比 000002194171 输出应为: <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&g

我的XML包含以下几行。如果值为“INR”,我想在中添加一个子标记


0001
5N
0552
0B
印度卢比
000002194171
输出应为:

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

0001
在里面
5N
0552
0B
印度卢比
000002194171
我在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>

在里面

查看您提供的xslt模板,它不仅不会添加PV1.2元素,而且应该什么也不输出,因为它可以跨所有现有元素复制任何代码

无论如何,这可能是一个输入错误,但是您当前的模板正在寻找PV1.18,而您的XML中没有。我认为在XML示例中,PV1.8应该是PV1.18。(我还认为这里应该使用“=”而不是“eq”)。不过,理想情况下,该检查不应位于xsl:choose(特别是当您没有xsl:others)中,而应在模板匹配中进行检查

<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',则标识模板将完成所有工作,输出将与输入相同。

以后,请正确缩进XML。另外,请详细说明“不起作用”是什么意思。@Jim,我的意思是说它不起作用。
<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>