我有一个xml文件,我需要通过创建一个空父节点,将具有交易项ID(如 childA )的特定子节点移动/复制到父节点。
喜欢输入 XML:
<root>
<Payload>
<TradeItemVersion>
<TradeItemID>A</TradeItemID>
<TradeItemTitle>B</TradeItemTitle>
<ProductID>C</ProductID>
<TradeItemVersion>
<Child>
<TradeItemID>ChildA</TradeItemID>
<TradeItemTitle>Child</TradeItemTitle>
<ProductID>Child</ProductID>
<Child>
<Child>
<TradeItemID>ChildB</TradeItemID>
<TradeItemTitle>Child</TradeItemTitle>
<ProductID>Child</ProductID>
<Child>
<Payload>
<root>
最终输出:
<root>
<Payload>
<TradeItemVersion>
<TradeItemID>ChildA</TradeItemID>
<TradeItemTitle>Child</TradeItemTitle>
<ProductID>Child</ProductID>
<TradeItemVersion>
<TradeItemVersion>
<TradeItemID>A</TradeItemID>
<TradeItemTitle>B</TradeItemTitle>
<ProductID>C</ProductID>
<TradeItemVersion>
<Child>
<TradeItemID>ChildB</TradeItemID>
<TradeItemTitle>Child</TradeItemTitle>
<ProductID>Child</ProductID>
<Child>
<Payload>
<root>
我能够将孩子复制到顶部,但所有孩子都被复制,我无法选择特定的孩子,而且我也无法创建新的空父标记以将孩子放入它
我的代码如下:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TradeItemVersion">
<xsl:apply-templates mode="search"/>
<xsl:call-template name="identity"/>
</xsl:template>
<xsl:template match="Child"/>
<xsl:template match="Child" mode="search">
<xsl:call-template name="identity"/>
</xsl:template>
<xsl:template match="text()" mode="search"/>
</xsl:stylesheet>
请建议。
答案 0 :(得分:0)
经过大量的打击和试验后,我自己找到了答案。
以下XSL会转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TradeItemVersion">
<xsl:apply-templates mode="search"/>
<xsl:call-template name="identity"/>
</xsl:template>
<xsl:template match="Child"/>
<xsl:template match="Child[contains(TradeItemID,'ChildA')]" mode="search">
<TradeItemVersion>
<xsl:call-template name="identity"/>
</TradeItemVersion>
</xsl:template>
<xsl:template match="text()" mode="search"/>
</xsl:stylesheet>
输入XML:
<root>
<Payload>
<TradeItemVersion>
<TradeItemID>A</TradeItemID>
<TradeItemTitle>B</TradeItemTitle>
<ProductID>C</ProductID>
<Child>
<TradeItemID>ChildA</TradeItemID>
<TradeItemTitle>Child</TradeItemTitle>
<ProductID>Child</ProductID>
</Child>
<Child>
<TradeItemID>ChildB</TradeItemID>
<TradeItemTitle>Child</TradeItemTitle>
<ProductID>Child</ProductID>
</Child>
</TradeItemVersion>
</Payload>
</root>
输出XML:
<root>
<Payload>
<TradeItemVersion>
<Child>
<TradeItemID>ChildA</TradeItemID>
<TradeItemTitle>Child</TradeItemTitle>
<ProductID>Child</ProductID>
</Child>
</TradeItemVersion>
<TradeItemVersion>
<TradeItemID>A</TradeItemID>
<TradeItemTitle>B</TradeItemTitle>
<ProductID>C</ProductID>
</TradeItemVersion>
</Payload>
</root>