XSLT:添加元素,从文件

时间:2016-02-18 20:11:43

标签: html xml linux bash xslt

我遇到了一个复杂的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版本并不重要。

1 个答案:

答案 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>