我有下面的XML,我需要转换:
XML><CONTENT>
<DESCRIPTION TYPE="NODE"></DESCRIPTION>
<DETAIL TYPE="NODE"></DETAIL>
<DATA TYPE="NODE">
<ITEM DESC="ENTITY" VALUE="Y"></ITEM>
<ITEM DESC="REQUEST" VALUE="Y"></ITEM>
</DATA>
</CONTENT>
对于每个具有TYPE="NODE"
的元素,将标记名称重命名为NODE
,并将前一个标记名称作为DESC
,这也适用于根元素CONTENT
,如下所示:
预期XML
<NODE DESC="CONTENT">
<NODE DESC="DESCRIPTION"></NODE>
<NODE DESC="DETAIL"></NODE>
<NODE DESC="DATA">
<ITEM DESC="ENTITY" VALUE="Y"></ITEM>
<ITEM DESC="REQUEST" VALUE="Y"></ITEM>
</NODE>
</NODE>
我能够使用下面的转换重命名根标签,但不知道如何做其余的,我正在尝试使用<xsl:if test="DESC = 'NODE'">
,但卡住了:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="CONTENT">
<NODE DESC="CONTENT">
<xsl:apply-templates select="@*|node()" />
</NODE>
</xsl:template>
</xsl:stylesheet>
将样式表更改为
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="CONTENT|*[@TYPE='NODE']">
<NODE DESC="{name()}">
<xsl:apply-templates select="@*[not(name()='TYPE')]|node()" />
</NODE>
</xsl:template>
</xsl:stylesheet>
输出应该是预期的。如果您使用名称空间,您可能应该将name()
更改为local-name()
。