XSLT - 模板不适用于某些节点
XSLT - templates not applied to some nodes
我有一个这样的xml,
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
<cd>
<title>Unchain my heart</title>
<artist>Joe Cocker</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
</catalog>
我需要做的是从原始 xml 中删除 <year>
节点,将 <artist>
节点更改为 <name>
并添加新节点(<time>
, <version>
) 在最终 <cd>
节点的末尾。
我编写了以下 XSLT 代码,
<xsl:variable name="time" as="xs:dateTime" select="current-dateTime()"/>
<xsl:variable name="version" as="xs:double" select="1.0"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="catalog/cd/artist">
<name><xsl:apply-templates/></name>
</xsl:template>
<xsl:template match="catalog/cd/year"/>
<xsl:template match="catalog/cd[last()]">
<xsl:copy-of select="."/>
<time><xsl:value-of select="$time"/></time>
<version><xsl:value-of select="$version"/></version>
</xsl:template>
输出如下,
<?xml version="1.0" encoding="UTF-8"?><catalog>
<cd>
<title>Empire Burlesque</title>
<name>Bob Dylan</name>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
</cd>
<cd>
<title>Hide your heart</title>
<name>Bonnie Tyler</name>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
</cd>
<cd>
<title>Unchain my heart</title>
<artist>Joe Cocker</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
<time>2015-06-29T13:41:49.885+05:30</time>
<version>1</version>
</catalog>
如您所见,代码运行良好,但似乎只有最终节点未应用模板(在最终节点中 <artist>
节点未更改 <year>
节点出现)。
我该如何解决这个问题。
在您的最后一个模板中,替换:
<xsl:copy-of select="."/>
与:
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
改变
<xsl:template match="catalog/cd[last()]">
<xsl:copy-of select="."/>
<time><xsl:value-of select="$time"/></time>
<version><xsl:value-of select="$version"/></version>
</xsl:template>
至
<xsl:template match="catalog/cd[last()]">
<xsl:copy>
<xsl:apply-templates>
<time><xsl:value-of select="$time"/></time>
<version><xsl:value-of select="$version"/></version>
</xsl:copy>
</xsl:template>
我有一个这样的xml,
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
<cd>
<title>Unchain my heart</title>
<artist>Joe Cocker</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
</catalog>
我需要做的是从原始 xml 中删除 <year>
节点,将 <artist>
节点更改为 <name>
并添加新节点(<time>
, <version>
) 在最终 <cd>
节点的末尾。
我编写了以下 XSLT 代码,
<xsl:variable name="time" as="xs:dateTime" select="current-dateTime()"/>
<xsl:variable name="version" as="xs:double" select="1.0"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="catalog/cd/artist">
<name><xsl:apply-templates/></name>
</xsl:template>
<xsl:template match="catalog/cd/year"/>
<xsl:template match="catalog/cd[last()]">
<xsl:copy-of select="."/>
<time><xsl:value-of select="$time"/></time>
<version><xsl:value-of select="$version"/></version>
</xsl:template>
输出如下,
<?xml version="1.0" encoding="UTF-8"?><catalog>
<cd>
<title>Empire Burlesque</title>
<name>Bob Dylan</name>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
</cd>
<cd>
<title>Hide your heart</title>
<name>Bonnie Tyler</name>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
</cd>
<cd>
<title>Unchain my heart</title>
<artist>Joe Cocker</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
<time>2015-06-29T13:41:49.885+05:30</time>
<version>1</version>
</catalog>
如您所见,代码运行良好,但似乎只有最终节点未应用模板(在最终节点中 <artist>
节点未更改 <year>
节点出现)。
我该如何解决这个问题。
在您的最后一个模板中,替换:
<xsl:copy-of select="."/>
与:
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
改变
<xsl:template match="catalog/cd[last()]">
<xsl:copy-of select="."/>
<time><xsl:value-of select="$time"/></time>
<version><xsl:value-of select="$version"/></version>
</xsl:template>
至
<xsl:template match="catalog/cd[last()]">
<xsl:copy>
<xsl:apply-templates>
<time><xsl:value-of select="$time"/></time>
<version><xsl:value-of select="$version"/></version>
</xsl:copy>
</xsl:template>