我的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>
答案 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',那么身份模板会完成所有工作,输出将与输入相同。