我遇到了一个复杂的XSLT问题。
Input.xml中
<ITEM>
<ID>00050802</PRODUCTID>
<ISBN>SCKTVO</PRODUCTEAN>
<NAME>VOYAGE</PRODUCTNAME>
<OTHERDATA></OTHERDATA>
</ITEM>
<ITEM>
<ID>00033802</PRODUCTID>
<ISBN>OPDFJD</PRODUCTEAN>
<NAME>TEST</PRODUCTNAME>
<OTHERDATA></OTHERDATA>
</ITEM>
这里我想添加一个新元素<DESCRIPTION>
。棘手的部分:内容在单独的文件中,描述文件的文件名是:(00050802.html,00033802.html === <ID>.html
)。 .html包含一些html代码,因此内容应该包含在CDATA中。
的Output.xml
<ITEM>
<ID>00050802</PRODUCTID>
<ISBN>SCKTVO</PRODUCTEAN>
<NAME>VOYAGE</PRODUCTNAME>
<OTHERDATA></OTHERDATA>
<DESCRIPTION><![CDATA[
00050802.html content
]]></DESCRIPTION>
</ITEM>
<ITEM>
<ID>00033802</PRODUCTID>
<ISBN>OPDFJD</PRODUCTEAN>
<NAME>TEST</PRODUCTNAME>
<OTHERDATA></OTHERDATA>
<DESCRIPTION><![CDATA[
00033802.html content
]]></DESCRIPTION>
</ITEM>
XSLT版本并不重要。
答案 0 :(得分:2)
您可以使用unparsed-text()
检索HTML文件的内容,并使用xsl:output
声明中的cdata-section-elements
属性确保使用CDATA序列化DESCRIPTION元素的内容:< / p>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output cdata-section-elements="DESCRIPTION"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ITEM">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<DESCRIPTION>
<xsl:variable name="filename" select="concat(ID, '.html')"/>
<xsl:value-of select="$filename"/>
<xsl:value-of select="unparsed-text($filename)"/>
</DESCRIPTION>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>