Xml 如果另一个childtag在XSLT中有特定的字符串,我们如何添加一个子标记?
我的XML包含以下几行。如果值为“INR”,我想在中添加一个子标记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
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>