以XML开头的XSL PI名称是保留的

时间:2016-11-04 17:37:22

标签: xml xslt transformation

我正在解析XML文档以创建另一个XML文档。

文件看起来像这样:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="02_tranformation.xsl"?>
<ROWSET>
 <ROW>
  <SRC_TABLE>myTable</SRC_TABLE>
  <SRC_COLUMN>myColumn</SRC_COLUMN>  
 </ROW>
</ROWSET>

和02_tranformation.xsl文件是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fn="http://www.w3.org/2005/xpath-functions">

<xsl:output method="text" indent="no" encoding="UTF-8"/>

  <xsl:template match="/ROWSET">
    &lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;!DOCTYPE POWERMART SYSTEM "powrmart.dtd"&gt;
  </xsl:template>
</xsl:stylesheet>

结果应该是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd">

但结果是

TEMPLATE_ERROR: TRANSFORMATION: ORA-31011: XML parsing failed
ORA-19213: error occurred in XML processing at lines 1
LPX-00209: PI names starting with XML are reserved

我正在寻找许多帮助网站,但我仍然没有说明,这是什么意思。 我不知道它是否重要但是它在Apex应用程序中运行,该应用程序从数据库读取表名(从...中选择),从此结果创建XML并且我正在解析此结果。问题是,此代码在资源管理器中工作,但在此应用程序中不起作用。 有人可以帮我吗? 非常感谢 学家

2 个答案:

答案 0 :(得分:1)

使用显示的声明生成文档的正确方法是:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" doctype-system="powrmart.dtd" />

<xsl:template match="/ROWSET">
    <POWERMART/>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

产生所需输出的一种方法 - 如果你真的必须将其输出为文本

.count

当应用于任何XML文档(忽略/未使用)时,结果为

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="/*">
    <xsl:value-of select=
    "'&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#xA;'"/>
    <xsl:value-of select="'&lt;!DOCTYPE POWERMART SYSTEM &quot;powrmart.dtd&quot;&gt;'"/>
  </xsl:template>
</xsl:stylesheet>

请注意:但是,不需要XSLT将字符串文字写入输出 - 在C(或任何传统的PL)应用程序中执行此操作。

可以使用<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE POWERMART SYSTEM "powrmart.dtd"> 声明输出所需的两行作为XML文档的序言。

只需使用

<xsl:output>

您无需指定方法版本编码属性,因为为这些伪属性生成的默认值XML声明正是您所需要的。