如何在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。
答案 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