使用XSLT在XML中添加xml元素

时间:2016-08-17 11:59:20

标签: xml xslt xslt-1.0

我想在XML中添加一个元素,如果缺少某个特定节点,则需要将其添加回来。

示例输入消息是

<document>
<body>
    <party>
        <gtin>1000909090</gtin>
        <pos>
            <attrGroupMany name="temperatureInformation">
                <row>
                    <attr name="temperatureCode">STORAGE</attr>                 
                    <attrGroupMany name="temperatureStats">
                        <attr name="StatsCode">CODE5</attr>
                    </attrGroupMany> 
                </row>
                <row>
                    <attr name="temperatureCode">STORAGETEN</attr>                      
                </row>
                <row>
                    <attr name="temperatureCode">HANDLING</attr>                    
                    <attrGroupMany name="temperatureStats">
                        <attr name="StatsCode">CODE4</attr>
                    </attrGroupMany>
                </row>
                <row>
                    <attr name="temperatureCode">HANDLINGONE</attr>
                    <attrGroupMany name="temperatureStats">
                        <attr name="StatsCode">CODE9</attr>
                    </attrGroupMany>
                </row>
            </attrGroupMany>
        </pos>
    </party>    
</body>
</document>

由于第二个节点缺少attrGroupMany name =“temperatureStats”,因此需要将其添加回来。

<document>
<body>
    <party>
        <gtin>1000909090</gtin>
        <pos>
            <attrGroupMany name="temperatureInformation">
                <row>
                    <attr name="temperatureCode">STORAGE</attr>                 
                    <attrGroupMany name="temperatureStats">
                        <attr name="StatsCode">CODE5</attr>
                    </attrGroupMany> 
                </row>
                <row>
                    <attr name="temperatureCode">STORAGETEN</attr>  
                    <attrGroupMany name="temperatureStats"/>                        
                </row>
                <row>
                    <attr name="temperatureCode">HANDLING</attr>                    
                    <attrGroupMany name="temperatureStats">
                        <attr name="StatsCode">CODE4</attr>
                    </attrGroupMany>
                </row>
                <row>
                    <attr name="temperatureCode">HANDLINGONE</attr>
                    <attrGroupMany name="temperatureStats">
                        <attr name="StatsCode">CODE9</attr>
                    </attrGroupMany>
                </row>
            </attrGroupMany>
        </pos>
    </party>    
</body>
</document>

基本上我们需要检查是否存在attrGroupMany name =“temperatureStats”,然后添加它。

任何人都可以建议一种方法

1 个答案:

答案 0 :(得分:0)

基本上我们需要检查是否存在attrGroupMany name =“temperatureStats”,然后添加它。

转换为

<xsl:if test="not(attrGroupMany[@name='temperatureStats'])">
    <attrGroupMany name="temperatureStats"/>
</xsl:if>

只需将其应用于目标row元素即可。因此样式表:

<?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:strip-space elements="*"/>
    <xsl:output indent="yes"/>

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

    <xsl:template match="row">
        <xsl:copy>
            <xsl:apply-templates/>
            <xsl:if test="not(attrGroupMany[@name='temperatureStats'])">
                <attrGroupMany name="temperatureStats"/>
            </xsl:if>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>