XSLT如何合并模板并为指定元素添加已有Number字段
XML转换需求
- 移除所有节点的
mask属性 - 删除所有节点中的
version和status子元素 Number字段必须置于Record、element1、element2、element3、element4等元素的最顶部
输入XML
<AllObjects> <Objects> <Record mask="1234qwer"> <reference>104006ALS</reference> <version>9</version> <status>NEW</status> <createdTime>2018-06-18T09:37:48.560Z</createdTime> <links> <link mask="1234qwer12"> <reference>112045MS</reference> <version>0</version> <linkReason>Revision</linkReason> <createdDateTime>2018-07-30T10:45:16.870Z</createdDateTime> <lastModifiedDateTime>2018-07-30T10:45:16.870Z</lastModifiedDateTime> <relevantDateTime>2018-07-30T10:45:16.870Z</relevantDateTime> <element1 mask="eqwrwqe12"> <reference>17001</reference> <version>1</version> </element1> </link> <link mask="q0SM9"> <reference>109085</reference> <version>0</version> <linkReason>SomeReason</linkReason> <createdDateTime>2018-05-18T10:50:08.520Z</createdDateTime> <lastModifiedDateTime>2018-05-18T10:50:08.520Z</lastModifiedDateTime> <relevantDateTime>2018-05-18T10:50:08.520Z</relevantDateTime> <element2 mask="q0SM934232"> <reference>13001</reference> <version>1</version> <conditions> <condition mask="q0SM921312"> <reference>9001</reference> <version>1</version> <conditionNumber>1</conditionNumber> <conditionVariations/> </condition> </conditions> </element2> </link> <link mask="yq0SM92"> <reference>109043</reference> <version>0</version> <element3 mask="yJq0SM92"> <reference>21006</reference> <version>8</version> <status>NEW</status> <createdDateTime>2018-05-18T10:16:22.430Z</createdDateTime> <links> <link mask="yJq0SM9212"> <reference>112193</reference> <version>1</version> <fromDate>2018-07-31</fromDate> <element4 mask="12yJq0SM9"> <reference>26004</reference> <version>0</version> <status>NEW</status> <createdDateTime>2018-08-24T20:46:55.500Z</createdDateTime> </element4> </link> </links> </element3> </link> </links> <Number>999999</Number> </Record> </Objects> </AllObjects>
原有XSLT问题说明
- 缺少根标签
<xsl:stylesheet>的开头部分 - 处理目标元素时先输出
Number后又调用了全量apply-templates,会导致Number重复输出 element1~element4本身没有Number子元素,无法直接读取到值,需要复用顶层Record的Number值
修正后可用的XSLT代码
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <!-- 存储顶层Record的Number值全局复用 --> <xsl:variable name="globalNumber" select="/AllObjects/Objects/Record/Number"/> <!-- 身份转换模板:默认复制所有节点和属性 --> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template> <!-- 移除所有mask属性 --> <xsl:template match="@mask"/> <!-- 删除所有version和status元素 --> <xsl:template match="version | status"/> <!-- 处理需要把Number放顶部的元素 --> <xsl:template match="Record | element1 | element2 | element3 | element4"> <xsl:copy> <xsl:apply-templates select="@*"/> <!-- 输出Number,Record用自身的,其他element用全局变量 --> <xsl:choose> <xsl:when test="self::Record"> <xsl:apply-templates select="Number"/> </xsl:when> <xsl:otherwise> <Number><xsl:value-of select="$globalNumber"/></Number> </xsl:otherwise> </xsl:choose> <!-- 匹配除了Number、version、status之外的其他子节点,避免重复输出 --> <xsl:apply-templates select="*[not(self::Number or self::version or self::status)]"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
内容的提问来源于stack exchange,提问作者Ilja
相关产品推荐
相关产品推荐

