使用XSLT进行转换时,我无法对节点内容进行编码。我的输入XML是下面的:
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Edited by XMLSpy® -->
<catalog>
<cd>
<title>D-Link</title>
<artist>Bob Dylan</artist>
<country>USA</country>
</cd>
<cd>
<title>x-<i>NetGear</i></title>
<artist>Rod Stewart</artist>
<country>UK</country>
</cd>
<cd>
<title>LG</title>
<artist>Andrea Bocelli</artist>
<country>EU</country>
</cd>
</catalog>
XSLT是:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<Root>
<xsl:for-each select="catalog/cd">
<Product>
<xsl:attribute name="title">
<xsl:copy-of select="title/node()"/>
</xsl:attribute>
</Product>
</xsl:for-each>
</Root>
</xsl:template>
</xsl:stylesheet>
目前我收到的错误是:在为第二个CD标题迭代时,无法在“属性”类型的节点中构建“元素”类型的项目。
预期产出低于:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Product title="D-Link" />
<Product title="x-<i>NetGear</i>" />
<Product title="LG" />
</Root>
有人可以帮我解决上述问题吗?
答案 0 :(得分:1)
<xsl:copy-of>
将尝试其名称暗示的内容:它将尝试将所选节点(包括元素)复制到属性中。当然,该属性只能包含文本,而不能包含元素。
您可以使用专用模板创建“假标签”:
<?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" indent="yes"/>
<xsl:template match="/">
<Root>
<xsl:for-each select="catalog/cd">
<Product>
<xsl:attribute name="title">
<xsl:apply-templates select="title/node()" mode="escape-xml"/>
</xsl:attribute>
</Product>
</xsl:for-each>
</Root>
</xsl:template>
<xsl:template match="*" mode="escape-xml">
<xsl:value-of select="concat('<',local-name(),'>')"/>
<xsl:apply-templates select="node()"/>
<xsl:value-of select="concat('</',local-name(),'>')"/>
</xsl:template>
</xsl:stylesheet>
这将带来理想的结果。