如何将DSPACCNAME节点及其子节点移入同层级DSPACCINFO节点
解决方案
以下是可以实现需求的XSLT 1.0代码:
<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()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <!-- 匹配DSPACCINFO节点,先插入其紧邻的前一个DSPACCNAME,再处理自身内容 --> <xsl:template match="DSPACCINFO"> <xsl:copy> <!-- 复制当前DSPACCINFO的前一个兄弟节点DSPACCNAME --> <xsl:copy-of select="preceding-sibling::DSPACCNAME[1]"/> <!-- 处理DSPACCINFO自身的子节点 --> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <!-- 隐藏原始的DSPACCNAME节点,避免重复输出 --> <xsl:template match="DSPACCNAME"/> </xsl:stylesheet>
原代码问题分析
你之前的XSLT未实现核心需求,问题在于:
- 仅对
DSPACCNAME节点做了复制操作,但未将其嵌入到对应的DSPACCINFO内部 - 没有隐藏原始的
DSPACCNAME节点,导致输出中仍保留这些独立节点
应用后输出效果
使用上述XSLT处理输入XML后,会得到你预期的输出:
<ENVELOPE> <DSPACCINFO> <DSPACCNAME> <DSPDISPNAME>Account 1</DSPDISPNAME> </DSPACCNAME> <DSPOPAMT> <DSPOPAMTA>-100.14</DSPOPAMTA> </DSPOPAMT> <DSPDRAMT> <DSPDRAMTA></DSPDRAMTA> </DSPDRAMT> <DSPCRAMT> <DSPCRAMTA></DSPCRAMTA> </DSPCRAMT> <DSPCLAMT> <DSPCLAMTA>-100.14</DSPCLAMTA> </DSPCLAMT> </DSPACCINFO> <DSPACCINFO> <DSPACCNAME> <DSPDISPNAME>Account 2</DSPDISPNAME> </DSPACCNAME> <DSPOPAMT> <DSPOPAMTA></DSPOPAMTA> </DSPOPAMT> <DSPDRAMT> <DSPDRAMTA>-470.00</DSPDRAMTA> </DSPDRAMT> <DSPCRAMT> <DSPCRAMTA>470.00</DSPCRAMTA> </DSPCRAMT> <DSPCLAMT> <DSPCLAMTA></DSPCLAMTA> </DSPCLAMT> </DSPACCINFO> <DSPACCINFO> <DSPACCNAME> <DSPDISPNAME>Account 3</DSPDISPNAME> </DSPACCNAME> <DSPOPAMT> <DSPOPAMTA>-942.00</DSPOPAMTA> </DSPOPAMT> <DSPDRAMT> <DSPDRAMTA>-445.05</DSPDRAMTA> </DSPDRAMT> <DSPCRAMT> <DSPCRAMTA>446.00</DSPCRAMTA> </DSPCRAMT> <DSPCLAMT> <DSPCLAMTA>941.00</DSPCLAMTA> </DSPCLAMT> </DSPACCINFO> <DSPACCINFO> <DSPACCNAME> <DSPDISPNAME>Account 4</DSPDISPNAME> </DSPACCNAME> <DSPOPAMT> <DSPOPAMTA></DSPOPAMTA> </DSPOPAMT> <DSPDRAMT> <DSPDRAMTA>-830.99</DSPDRAMTA> </DSPDRAMT> <DSPCRAMT> <DSPCRAMTA>830.99</DSPCRAMTA> </DSPCRAMT> <DSPCLAMT> <DSPCLAMTA></DSPCLAMTA> </DSPCLAMT> </DSPACCINFO> </ENVELOPE>
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

