我有一个输入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>
我的模板中有问题吗?
答案 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>