使用XSLT 2.0从输入文档复制整个Doctype标记

时间:2018-07-19 21:56:55

标签: html xml xslt doctype

我尝试了几件事,但没有成功。我有一个包含声明的文件实体的输入文档。我需要完全照原样复制它以输出文档。这就是它的样子(#是此处的删除符号):

<!DOCTYPE ##### PUBLIC "-##//EN"
"###.dtd" [
<!ENTITY Chap##-## SYSTEM "###.xml">
<!ENTITY Chap##-### SYSTEM "####.xml">
<!ENTITY Chap##-#### SYSTEM "#####.xml">

现在,我使用一个身份模板和一个match ='/'将文档保存到变量,然后使用特定的模板匹配项来匹配所有其他XML元素,并将它们输出为特定的HTML元素。唯一不起作用的是保持该doctype语句完好。

1 个答案:

答案 0 :(得分:0)

使用XSLT 2.0(或更高版本)的一个技巧是使用函数unparsed-text()以字符串的形式读取源文档,然后应用正则表达式或使用其他字符串函数从顶部选择DTD部分。使用xsl:value-ofdisable-output-escaping="yes"

将文件包含在输出中

例如,将replace()与正则表达式模式和捕获组一起使用:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"  indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/">
        <xsl:value-of disable-output-escaping="yes" 
                      select="replace(
                                unparsed-text(base-uri()), 
                                '.*?(\n?&lt;!DOCTYPE\s.*\]>)\n?&lt;.*', 
                                '$1', 
                                's')"/>
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>