我有这个XML文件:
<!DOCTYPE configuration [
<!ENTITY Reload_POST SYSTEM "Configuration_Reload_POST.xml">
]>
<configuration name="Ibis4Education">
<jmsRealms>
<jmsRealm realmName="jdbc" datasourceName="jdbc/${instance.name.lc}"/>
<!-- jmsRealm realmName="qcf" queueConnectionFactoryName="jms/qcf"/ -->
</jmsRealms>
&Reload_POST;
</configuration>
我想添加另一个<!ENTITY File_Name SYSTEM "file_location.xml">
和另一个&File_Name;
行..
我不熟悉XSLT并且在Google上找不到任何好的例子,这就是我在这里问的原因。
答案 0 :(得分:0)
XSLT数据模型不知道任何DTD或任何实体引用,因此XSLT不是正确的任务,除非您使用具有扩展的处理器来输出DTD详细信息和实体引用。我只知道Saxon 9的商业版支持该版本,请参阅https://www.saxonica.com/html/documentation/extensions/instructions/doctype.html和https://www.saxonica.com/html/documentation/extensions/instructions/entity-ref.html了解该处理器支持的两个扩展指令。即使给出了这些扩展指令,我也不确定是否有办法处理现有的DTD,除非你另外将Andrew Welch的LexEv(http://andrewjwelch.com/lexev/)添加到工具链中。
因此,一般来说,这不是您可以使用XSLT解决的任务。其他XML树操作方式(如DOM)在DTD操作方面也可能受到限制。
答案 1 :(得分:0)
要使您的XML输入有效,请用实体替换保留的XML字符&amp; 。如果你写出预期的输出会更容易:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE configuration [
<!ENTITY Reload_POST SYSTEM "Configuration_Reload_POST.xml"><!ENTITY File_Name SYSTEM "file_location.xml">]>]]></xsl:text>
<xsl:copy><xsl:apply-templates select="node()"/></xsl:copy>
</xsl:template>
<xsl:template match="configuration">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:text>&File_Name;</xsl:text>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>