如果标签不存在,则添加新标签

时间:2019-03-19 10:54:18

标签: xml xslt

我有一个输入xml,如果xml中不存在标签,我想添加新标签。

<xsl:template match="jsonObject[not(aaa)]">
  <xsl:copy>
   <xsl:apply-templates select="@*"/>

     <aaa>test</aaa>
   <xsl:apply-templates select="node()"/>
  </xsl:copy>
    </xsl:template>

    <xsl:template match="jsonObject[not(bbb)]">
  <xsl:copy>
   <xsl:apply-templates select="@*"/>

     <bbb>test2</bbb>
   <xsl:apply-templates select="node()"/>
  </xsl:copy>
    </xsl:template>

输入消息

<jsonObject>
   <ttt>xxxx</ttt>
   <ppp>yyy</ppp>
   <mmm>zzz</mmm>
   <ddd>00000</ddd>
<jsonObject>

预期消息

<jsonObject>
   <aaa>test</aaa>
   <bbb>test2</bbb>
   <ttt>xxxx</ttt>
   <ppp>yyy</ppp>
   <mmm>zzz</mmm>
   <ddd>00000</ddd>
<jsonObject>

但是,从模板中,我实现了仅将最后一个标记添加到输入消息中。

收到的消息

<jsonObject>
   <bbb>test2</bbb>
   <ttt>xxxx</ttt>
   <ppp>yyy</ppp>
   <mmm>zzz</mmm>
   <ddd>00000</ddd>
<jsonObject>

我的模板中有问题吗?

2 个答案:

答案 0 :(得分:4)

如果您有一个既没有jsonObject也没有aaa元素的bbb,则两个模板都将具有相同的优先级匹配,这被认为是错误。

您可以做的就是简单地将一个模板与所有jsonObject元素匹配,并在内部进行xsl:if检查

<xsl:template match="jsonObject">
<xsl:copy>
  <xsl:apply-templates select="@*"/>
  <xsl:if test="not(aaa)">
     <aaa>test</aaa>
  </xsl:if>
  <xsl:if test="not(bbb)">
     <bbb>test2</bbb>
  </xsl:if>
  <xsl:apply-templates />
</xsl:copy>
</xsl:template>

答案 1 :(得分:1)

完整的XSLT就像:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="jsonObject">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:if test="not(aaa)">
                <aaa>test</aaa>
            </xsl:if>
            <xsl:if test="not(bbb)">
                <bbb>test2</bbb>
            </xsl:if>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>


</xsl:stylesheet>