Oracle XSL处理器扩展名称空间

时间:2010-01-13 23:00:17

标签: xml oracle xslt

我正在生成并验证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正在“内联”或扩展所有名称空间前缀。为什么要这样做?如何让它停止?

3 个答案:

答案 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">
          ...