我有一个看起来像这样的
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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。