XSLT - 如何将两行附加到现有xml

时间:2017-11-29 14:41:27

标签: xml xslt

我有这个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上找不到任何好的例子,这就是我在这里问的原因。

2 个答案:

答案 0 :(得分:0)

XSLT数据模型不知道任何DTD或任何实体引用,因此XSLT不是正确的任务,除非您使用具有扩展的处理器来输出DTD详细信息和实体引用。我只知道Saxon 9的商业版支持该版本,请参阅https://www.saxonica.com/html/documentation/extensions/instructions/doctype.htmlhttps://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>&amp;File_Name;</xsl:text>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>