我想在xml中添加新标记,并将现有XML中的一些元素复制为此新添加标记的子元素。
我现有的XML文件是:
<App>
<TITLE>Application NAME</TITLE>
<USER>USER NAME</USER>
<COL>
<TEXT>Sr No.</TEXT>
<INDEX>1</INDEX>
</COL>
<COL>
<TEXT>Name</TEXT>
<INDEX>1</INDEX>
</COL>
<COL>
<TEXT>SubName</TEXT>
<INDEX>1</INDEX>
</COL>
<FILTER>
<LABEL>NAME</LABEL>
<NAME>FilterByName</NAME>
</FILTER>
<FILTER>
<LABEL>SUBNAME</LABEL>
<NAME>FilterBySubName</NAME>
</FILTER>
</App>
我想添加新的Tag COL_LIST并移动其中的所有COL元素。所以,我想要的输出XML将是
<App>
<TITLE>Application NAME</TITLE>
<USER>USER NAME</USER>
<COL_LIST>
<COL>
<TEXT>Sr No.</TEXT>
<INDEX>1</INDEX>
</COL>
<COL>
<TEXT>Name</TEXT>
<INDEX>1</INDEX>
</COL>
<COL>
<TEXT>SubName</TEXT>
<INDEX>1</INDEX>
</COL>
</COL_LIST>
<FILTER>
<LABEL>NAME</LABEL>
<NAME>FilterByName</NAME>
</FILTER>
<FILTER>
<LABEL>SUBNAME</LABEL>
<NAME>FilterBySubName</NAME>
</FILTER>
</App>
我使用以下XSLT文件
尝试了这种转换<?xml version="1.0" encoding="UTF-8"?>
<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:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="App">
<xsl:copy>
<COL_LIST>
<xsl:apply-templates select="@*|COL"/>
</COL_LIST>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但是,我从现有的XML中删除了除COL以外的其他标签,我将结果XML作为
<App>
<TITLE>Application NAME</TITLE>
<USER>USER NAME</USER>
<COL_LIST>
<COL>
<TEXT>Sr No.</TEXT>
<INDEX>1</INDEX>
</COL>
<COL>
<TEXT>Name</TEXT>
<INDEX>1</INDEX>
</COL>
<COL>
<TEXT>SubName</TEXT>
<INDEX>1</INDEX>
</COL>
</COL_LIST>
</App>
答案 0 :(得分:2)
以这种方式尝试:
XSLT 1.0
<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="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="App">
<xsl:copy>
<xsl:apply-templates select="TITLE|USER"/>
<COL_LIST>
<xsl:apply-templates select="COL"/>
</COL_LIST>
<xsl:apply-templates select="FILTER"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如果订单不重要,您可以将其简化为:
<xsl:template match="App">
<xsl:copy>
<xsl:apply-templates select="*[not(self::COL)]"/>
<COL_LIST>
<xsl:apply-templates select="COL"/>
</COL_LIST>
</xsl:copy>
</xsl:template>