使用xslt将xml元素移动到另一个元素中
发布时间:2020-12-16 23:13:04 所属栏目:百科 来源:网络整理
导读:我有一个看起来像这样的 XML executionPlan name="Test" paramList param name="param1" default=""//paramListvarList var name="bla" default=":[param1]"//varListsimpleSteps limitToHostSet="bla" execNative exec cmd="/bin/sh"/ /execNative/simpleSt
我有一个看起来像这样的
XML
<executionPlan name="Test" > <paramList> <param name="param1" default=""/> </paramList> <varList> <var name="bla" default=":[param1]"/> </varList> <simpleSteps limitToHostSet="bla"> <execNative> <exec cmd="/bin/sh"/> </execNative> </simpleSteps> 我需要将其转换为如下所示: <executionPlan name="Test" > <paramList> <param name="param1" default=""/> </paramList> <simpleSteps limitToHostSet="bla"> <varList> <var name="bla" default=":[param1]"/> </varList> <execNative> <exec cmd="/bin/sh"/> </execNative> </simpleSteps> 如您所见,varList元素需要嵌套在开始标记后面的simpleSteps元素中. simpleSteps中可能还有其他varList元素,不能更改. 有任何想法如何用XSLT实现?我是XSLT的新手并且徒劳地尝试了一整天……任何帮助都会非常感激. 卢茨 解决方法
以下样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <xsl:template match="varList[following-sibling::*[1][self::simpleSteps]]" /> <xsl:template match="simpleSteps"> <xsl:copy> <xsl:apply-templates select="@*" /> <xsl:copy-of select="preceding-sibling::varList[1]" /> <xsl:apply-templates select="node()" /> </xsl:copy> </xsl:template> </xsl:stylesheet> 在此输入: <executionPlan name="Test"> <paramList> <param name="param1" default="" /> </paramList> <varList> <var name="bla" default=":[param1]" /> </varList> <varList> <var name="bla2" default=":[param2]" /> </varList> <simpleSteps limitToHostSet="bla"> <execNative> <exec cmd="/bin/sh" /> </execNative> </simpleSteps> </executionPlan> 生产: <executionPlan name="Test"> <paramList> <param name="param1" default="" /> </paramList> <varList> <var name="bla" default=":[param1]" /> </varList> <simpleSteps limitToHostSet="bla"> <varList> <var name="bla2" default=":[param2]" /> </varList> <execNative> <exec cmd="/bin/sh" /> </execNative> </simpleSteps> </executionPlan> 编辑:仅将前一个varList移动??到其关联的simpleSteps中.所有其他varList元素都通过不变复制. 我突然不清楚这是否是所需的行为,或者simpleSteps元素中是否有多个varList元素应该保持不变.请参阅我原来的解决方案: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <xsl:template match="varList" /> <xsl:template match="simpleSteps"> <xsl:copy> <xsl:apply-templates select="@*" /> <xsl:copy-of select="../varList" /> <xsl:apply-templates select="node()" /> </xsl:copy> </xsl:template> </xsl:stylesheet> 在此输入: <executionPlan name="Test"> <paramList> <param name="param1" default="" /> </paramList> <varList> <var name="bla" default=":[param1]" /> </varList> <simpleSteps limitToHostSet="bla"> <varList> <var name="bla7" default=":[param7]" /> </varList> <execNative> <exec cmd="/bin/sh" /> </execNative> </simpleSteps> </executionPlan> 生产: <executionPlan name="Test"> <paramList> <param name="param1" default="" /> </paramList> <simpleSteps limitToHostSet="bla"> <varList> <var name="bla" default=":[param1]" /> </varList> <varList> <var name="bla7" default=":[param7]" /> </varList> <execNative> <exec cmd="/bin/sh" /> </execNative> </simpleSteps> </executionPlan> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |