如何在xsl的帮助下在xml中添加单个元素?

时间:2016-09-12 16:02:41

标签: xml xslt

如何在xsl stylesheet的帮助下在xml中添加带有结束标记的单个xml元素。

这里的下面是我的xml。

1453

我的XSL stylehseet:

 <Checkpax xmlns="http://xml.api.com/test">
    <customerLevel>
        <customerDetails>
            <paxDetails>
                <surname>MUKHERJEE</surname>
                <type>A</type>
                <gender>M</gender>
            </paxDetails>
            <otherPaxDetails>
                <givenName>JOY</givenName>
                <title>MR</title>
                <age>11</age>
            </otherPaxDetails>
            <otherPaxDetails>
                <title>MR</title>
            </otherPaxDetails>
        </customerDetails>
        <staffDetails>
            <staffInfo/>
            <staffCategoryInfo>
                <attributeDetails>
                    <attributeType>NA</attributeType>
                </attributeDetails>
            </staffCategoryInfo>
        </staffDetails>
        <productLevel>
            <legLevel>
                <legLevelIndicator>
                    <statusDetails>
                        <indicator>abc</indicator>
                        <action>1</action>
                    </statusDetails>
                </legLevelIndicator>
            </legLevel>
        </productLevel>
        <CustomerLevel>
            <legLevel>
                <legLevelIndicator>
                    <statusDetails>
                        <indicator>cde</indicator>
                        <action>1</action>
                    </statusDetails>
                </legLevelIndicator>
            </legLevel>
        </CustomerLevel>
    </customerLevel>
</Checkpax>

这里我尝试在产品级标记end.dummyRootOne元素之前添加dumTXFSep,dummySegmentJan和dumTktFeb元素。在CustomerLevel标记之前添加end.dummyRootOne元素应该在产品级别的末尾添加end.dummyRoottwo。应该在里面添加LeglevelInfo productLevel / legLevel标签。

以下是我预期的xml。

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://xml.api.com/test"
    exclude-result-prefixes="ns0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="ns0:productLevel/ns0:legLevel/ns0:legLevelIndicator/ns0:statusDetails">
        <statusInformation xmlns="http://xml.api.com/test">
            <xsl:apply-templates/>
        </statusInformation>
    </xsl:template>
    <xsl:template match="ns0:customerLevel/ns0:productLevel/legLevel">
        <xsl:copy-of select="."/>
        <dumTXFSep/>
        <dummySegmentJan />
        <dumTktFeb />
    </xsl:template>
    <xsl:template match="ns0:customerLevel/ns0:productLevel">
        <xsl:copy-of select="."/>
        <dummyRootOne />
    </xsl:template>
</xsl:stylesheet>

请建议xsl,请帮助我有任何工具通过映射两个xml元素或任何好的学习资源来生成xsl。

1 个答案:

答案 0 :(得分:0)

XSLT的一般结构很好,使用XSLT标识模板和覆盖您希望更改的元素的模板。问题出在几个模板上。首先是这个...

<xsl:template match="ns0:customerLevel/ns0:productLevel">
    <xsl:copy-of select="."/>
    <dummyRootOne />
</xsl:template>

这里的主要问题是您使用xsl:copy-of。这将完全复制当前元素,但不会为任何子节点选择任何模板。这意味着XSLT中的其他模板将不与后代节点匹配。你应该在这里使用xsl:apply-templates

另请注意,您添加的dummyRootOne没有名称空间,但您可能希望将其添加到与XML相同的名称空间中。即做<dummyRootOne xmlns="http://xml.api.com/test" />。或者,您可以在xsl:stylesheet元素上定义默认命名空间以涵盖此内容:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://xml.api.com/test"

第二个问题(一旦修复第一个问题)就是使用此模板

<xsl:template match="ns0:customerLevel/ns0:productLevel/legLevel">
    <xsl:copy-of select="."/>
    <dumTXFSep/>
    <dummySegmentJan />
    <dumTktFeb />
</xsl:template>

此处的问题(除了xsl:copy-of的使用之外)是您错过了ns0的{​​{1}}前缀,因此它正在寻找没有命名空间的元素,并赢得了' t匹配XML中名称空间中的那个。您的问题还表明您希望匹配legLevel下的元素。

customerLevel