Lut*_*utz 5 xslt nested elements
我有一个看起来像这样的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>
Run Code Online (Sandbox Code Playgroud)
我需要将其转换为如下所示:
<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>
Run Code Online (Sandbox Code Playgroud)
如您所见,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>
Run Code Online (Sandbox Code Playgroud)
在此输入上:
<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>
Run Code Online (Sandbox Code Playgroud)
生产:
<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>
Run Code Online (Sandbox Code Playgroud)
编辑:仅将前一个varList移动到其关联的simpleSteps. 所有其他varList元素均按原样复制。
我突然不清楚这是否是所需的行为,或者元素varList内是否可能已有多个simpleSteps应该保持不变的元素。请参阅我针对该案例的原始解决方案:
<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>
Run Code Online (Sandbox Code Playgroud)
在此输入上:
<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>
Run Code Online (Sandbox Code Playgroud)
生产:
<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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7754 次 |
| 最近记录: |