我正在生成并验证XML,并且遇到了Oracle从前缀扩展完整命名空间的问题。 源文档可能如下所示:
<pcy>
<tList>
<currTrn>
<TXN_A>1</TXN_A>
<TXN_B>2</TXN_B>
...
变换如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sc="http://www.myCompany.com/schemaAlpha" xmlns:pl="http://www.myCompany.com/schemaBeta">
<xsl:template match="/">
<pcyItem>
<pl:mainTList>
<pl:currentTrnItem>
<sc:primaryTrnID>
<xsl:value-of select="/pcy/tList/currTrn/TXN_A"/>
</sc:primaryTrnID>
<sc:secondaryTrnID>
<xsl:value-of select="/pcy/tList/currTrn/TXN_B"/>
</sc:secondaryTrnID>
...
我期望的正确输出(当我使用像JEdit这样的程序时,我得到的是 - 它有一个XML转换插件)看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<pcyItem xmlns:pl="http://www.myCompany.com/schemaAlpha" xmlns:sc="http://www.myCompany.com/schemaBeta">
<pl:mainTList>
<pl:currentTrnItem>
<sc:primaryTrnID>1</scom:primaryTrnID>
<sc:secondaryTrnID>2</scom:secondaryTrnID>
...
Oracle实际生成的内容如下所示:
<pcyItem>
<pl:mainTList xmlns:pl="http://www.myCompany.com/schemaAlpha">
<pl:currentTrnItem>
<sc:primaryTrnID xmlns:sc="http://www.myCompany.com/schemaBeta">1</sc:primaryTrnID>
<sc:secondaryTrnID xmlns:sc="http://www.myCompany.com/schemaBeta">2</sc:secondaryTrnID>
...
在我看来,Oracle正在“内联”或扩展所有名称空间前缀。为什么要这样做?如何让它停止?
答案 0 :(得分:0)
只是猜测,但看起来像Oracle隐式设置
exclude-result-prefixes="pl sc"
我会尝试设置
exclude-result-prefixes="#default"
覆盖可能的隐式排除。
答案 1 :(得分:0)
另一种看待这种情况的方法是:您是否需要停止Oracle处理器这样做?
从pcyItem开始,输出示例在语义上是相同的,所以可能它只是“看起来很好”而与你有关。 Oracle处理器选择仅在需要时声明命名空间,而不是在整个文档中使用它们。可以说这个更具体的范围更好,但我想这归结为品味问题。我怀疑你能做些什么。
任何消耗转换输出的东西,除了人类之外,都不会关心它读取的形式,所以它可能不值得担心太多。
答案 2 :(得分:0)
通过更改XSL来管理修复它:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<pcyItem xmlns:sc="http://www.myCompany.com/schemaBeta" xmlns:pl="http://www.myCompany.com/schemaAlpha">
...