我想将元素id
移动到Here
我的输入xml是
<COLLECTION>
<abc>
<id>1234</id>
</abc>
<AddedParts NAME="AddedParts" TYPE="Unknown" STATUS="0">
<Part>
</Part>
<Here>
</Here>
</AddedParts>
</COLLECTION>
预期输出
<COLLECTION>
<abc>
</abc>
<AddedParts NAME="AddedParts" TYPE="Unknown" STATUS="0">
<Part>
</Part>
<Here>
<id>1234</id>
</Here>
</AddedParts>
</COLLECTION>
我写的xsl是
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method= "xml" version= "1.0" encoding= "UTF-8" indent= "yes" />
<xsl:strip-space elements= "*" />
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match= "Here" >
<xsl:copy>
<xsl:apply-templates select= "node()|@*" />
<!-- move nodes to here -->
<xsl:apply-templates select= "../id " mode= "move" />
</xsl:copy>
</xsl:template >
< xsl:template match= "id" />
我无法达到预期的输出
答案 0 :(得分:0)
您当前的XSLT有两个问题
../id
,但id
不是当前父级的子级,而是当前父级下的abc
元素的子级。它应该是../../abc/id
。id
的文本内容,但不输出元素本身。试试这个XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method= "xml" version= "1.0" encoding= "UTF-8" indent= "yes" />
<xsl:strip-space elements= "*" />
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Here" >
<xsl:copy>
<xsl:apply-templates select= "node()|@*" />
<!-- move nodes to here -->
<xsl:apply-templates select= "../../abc/id" mode="move" />
</xsl:copy>
</xsl:template>
<xsl:template match= "id" />
<xsl:template match="id" mode="move">
<xsl:call-template name="identity" />
</xsl:template>
</xsl:stylesheet>
如果您不想以任何方式尝试转换id
,可以将其简化为此...
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method= "xml" version= "1.0" encoding= "UTF-8" indent= "yes" />
<xsl:strip-space elements= "*" />
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Here" >
<xsl:copy>
<xsl:apply-templates select= "node()|@*" />
<!-- move nodes to here -->
<xsl:copy-of select= "../../abc/id" />
</xsl:copy>
</xsl:template>
<xsl:template match= "id" />
</xsl:stylesheet>