我有以下需要轉換的 XML:
XML
<CONTENT>
<DATA TYPE="NODE">
<ITEM DESC="ENTITY" VALUE="Y"></ITEM>
<ITEM DESC="REQUEST" VALUE="Y"></ITEM>
</DATA>
<ITEM TYPE="INFO"></ITEM>
<ITEM TYPE="REQ"></ITEM>
<TAG DESC="FLAG1"></TAG>
<TAG DESC="FLAG2"></TAG>
<INFO TYPE="USAGE"></INFO>
</CONTENT>
標準適用于每個TYPE={name}將標簽名稱重命名為{name} of the TYPE并作為DESC前一個標簽名稱的元素,如下所示:
預期的 XML
<CONTENT>
<NODE DESC="DATA">
<ITEM DESC="ENTITY" VALUE="Y"></ITEM>
<ITEM DESC="REQUEST" VALUE="Y"></ITEM>
</NODE>
<INFO DESC="ITEM"></INFO>
<REQ DESC="ITEM"></REQ>
<TAG DESC="FLAG1"></TAG>
<TAG DESC="FLAG2"></TAG>
<USAGE DESC="INFO"></USAGE>
</CONTENT>
我在上一篇文章中使用了以下作業 XSL,但為了使其適用于這種情況,我必須為每種不同的型別進行映射,我試圖獲得一個通用的解決方案,它涵蓋了所有內容TYPE={name}:
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" omit-xml-declaration="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[@TYPE='NODE']">
<NODE DESC="{name()}">
<xsl:apply-templates select="@*[not(name()='TYPE')]|node()" />
</NODE>
</xsl:template>
<xsl:template match="*[@TYPE='INFO']">
<INFO DESC="{name()}">
<xsl:apply-templates select="@*[not(name()='TYPE')]|node()" />
</INFO>
</xsl:template>
(...)
</xsl:stylesheet>
uj5u.com熱心網友回復:
嘗試:
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="*[@TYPE]">
<xsl:element name="{@TYPE}">
<xsl:attribute name="DESC">
<xsl:value-of select="name()" />
</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/492128.html
