我尝试了几件事,但没有成功。我有一个包含声明的文件实体的输入文档。我需要完全照原样复制它以输出文档。这就是它的样子(#是此处的删除符号):
<!DOCTYPE ##### PUBLIC "-##//EN"
"###.dtd" [
<!ENTITY Chap##-## SYSTEM "###.xml">
<!ENTITY Chap##-### SYSTEM "####.xml">
<!ENTITY Chap##-#### SYSTEM "#####.xml">
现在,我使用一个身份模板和一个match ='/'将文档保存到变量,然后使用特定的模板匹配项来匹配所有其他XML元素,并将它们输出为特定的HTML元素。唯一不起作用的是保持该doctype语句完好。
答案 0 :(得分:0)
使用XSLT 2.0(或更高版本)的一个技巧是使用函数unparsed-text()
以字符串的形式读取源文档,然后应用正则表达式或使用其他字符串函数从顶部选择DTD部分。使用xsl:value-of
和disable-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?<!DOCTYPE\s.*\]>)\n?<.*',
'$1',
's')"/>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>