我有一个看起来像这样的
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>