我通过dbms_xmlschema.registerschema()包子程序将模式注册到Oracle XMLDB中。
然后,我从user_xml_schemas中选择已注册的架构。
架构返回正常,但 Oracle 已将各种与 Oracle 相关的信息插入到架构中。下面是一个示例插入(这只是众多插入之一):
xmlns:oraxdb="http://xmlns.oracle.com/xdb" oraxdb:storeVarrayAsTable="true" oraxdb:flags="2105633" oraxdb:schemaURL="mySchema.xsd" oraxdb:schemaOwner="bob" oraxdb:numProps="22">
这与我在数据库内的使用无关,但是我需要向数据库外部的使用者提供模式,而 Oracle 注释只是为我的目标外部使用者带来混淆的噪音。
我想要的是能够使用我的"发明"dbms_xmlschema_annotate实现类似于以下代码的东西。stripAllOracleAnnotations子程序:
begin
select dbms_xmlschema_annotate.stripAllOracleAnnotations(schema)
into vMyOriginalPreRegisteredSchema
from user_xml_schemas;
...
end;
所以我可以为外部消费者提供vMyOriginalPreRegisterSchema。
我已经狩猎过,但找不到任何可以从 xml db 返回"原始、干净"架构的东西。
任何协助将不胜感激。
注意:我尝试使用 XSL 转换来去除 Oracle 注释,但是尽管我创建的 XSL 文件在 XMLSpy 中运行良好,但 Oracle (18c) 完成转换没有错误,但返回完全不正确的结果。我通过xmltransform()和xmltype.transform()进行了测试。我只能假设这是因为Oracle正在内部解释oraxdb:节点并"做自己的事情"。
虽然这不是我的首选方法,因为通过正则表达式捕获所有情况可能容易出错,但以下内容似乎有效,并且是我目前可以找到实现我需要的唯一方法:
select regexp_replace(s.schema.getClobVal()
,'( oraxdb:.*?= *".*?"| xmlns:oraxdb="http://xmlns.oracle.com/xdb")',''
)
from user_xml_schemas s
where s.schema_url = 'my schema XDB URL';
注意:正如我的问题编辑中所解释的,尽管以下XSL转换在XMLspy中完美运行,并且在正常情况下是我的首选,但它通过Oracle xmltransform()或xmltype.transform()产生不正确的输出,因为Oracle似乎用内部注释污染了转换中的输出:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:oraxdb="http://xmlns.oracle.com/xdb"
exclude-result-prefixes="oraxdb"
>
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- copy all elements -->
<xsl:template match="*" priority="-1">
<xsl:element name="{name()}">
<xsl:copy-of select="@*[substring(name(),1,7) != 'oraxdb:']"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- Copy all other nodes -->
<xsl:template match="node()|@*" priority="-2">
<xsl:copy />
</xsl:template>
</xsl:stylesheet>
上述 XSL 方法使用 XSLT 从 XSLT 样式表中删除命名空间声明(因为 <xsl:copy> 不适用于删除 xmlns:oraxdb 命名空间声明本身的排除结果前缀)。