如果满足条件,则XSL重命名标签名称



我有下面的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'">,但卡住了:

XSL
>
<?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()

最新更新