命名空间错误:未定义关键字上的命名空间前缀 bd [英] namespace error : Namespace prefix bd on keyword is not defined

查看:38
本文介绍了命名空间错误:未定义关键字上的命名空间前缀 bd的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个巨大的 xml 文件,我想将其拆分为单独的 xml 文档;每个单独的 xml 文件都应该有一个明确的命名空间声明,如以下所需输出"部分所示.但是,我不断收到错误命名空间错误:关键字上的命名空间前缀 bd 未定义"

我的问题是,如何明确告诉我的 XSLT 处理器在结果输出中放置命名空间声明的位置?我在网上浏览了几个教程,但我不太明白如何解决这个问题.

部分 XSLT 代码段

<预><代码>......<xsl:模板匹配=章节"><bd:章节><xsl:apply-templates select="name"/><xsl:apply-templates select="page"/></bd:chapter></xsl:模板><xsl:template match="name"><bd:name><xsl:value-of select="."/></bd:name></xsl:模板>......

期望输出

更新 #1

<title></title><描述></描述></页面></章节>.........</书籍>

更新 #2

@polishchuk Update2 给出以下结果

<root xmlns:pd="namespace2"><pd:Book xmlns:pd="http://namespace1.org/"><pd_1:Name xmlns:pd="namespace2" xmlns:pd_1="http://namespace1.org/">A</pd_1:Name><pd:Description xmlns:pd="namespace2">A1</pd:Description></pd:Book><pd:Book xmlns:pd="http://namespace1.org/"><pd_1:Name xmlns:pd="namespace2" xmlns:pd_1="http://namespace1.org/">B</pd_1:Name><pd:Description xmlns:pd="namespace2">B1</pd:Description></pd:Book></root>

我希望命名空间出现的唯一速度是在 book 节点内.请看下面

<根><pd:Book xmlns:pd="http://namespace1.org/"><pd:Name>A</pd:Name><pd:描述>A1</pd:描述></pd:Book><pd:Book xmlns:pd="http://namespace1.org/"><pd:Name>B</pd_1:Name><pd:描述>B1</pd:描述></pd:Book></root>

解决方案

假设您有以下 XML:

<书><name>A</name><描述>A1</描述><书><name>B</name><描述>B1</描述></root>

所需的 XML(带命名空间):

<bd:书><bd:Name>A</bd:Name><pd:描述>A1</pd:描述></bd:Book><bd:书><bd:Name>B</bd:Name><pd:描述>B1</pd:描述></bd:Book></root>

适当的 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:bd="namespace1"xmlns:pd="namespace2"><xsl:output method="xml" indent="yes"/><xsl:template match="/"><根><xsl:apply-templates/></root></xsl:模板><xsl:template match="book"><bd:书><xsl:apply-templates/></bd:Book></xsl:模板><xsl:template match="name"><bd:名称><xsl:value-of select="."/></bd:姓名></xsl:模板><xsl:template match="描述"><pd:描述><xsl:value-of select="."/></pd:描述></xsl:模板></xsl:stylesheet>

您只需在 XSLT 中添加命名空间,然后使用命名空间的前缀创建节点.

更新 1:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:pd="namespace2"><xsl:output method="xml" indent="yes"/><xsl:template match="/"><根><xsl:apply-templates/></root></xsl:模板><xsl:template match="book"><bd:Book xmlns:bd="namespace1"><xsl:apply-templates/></bd:Book></xsl:模板><xsl:template match="name"><bd:Name xmlns:bd="namespace1"><xsl:value-of select="."/></bd:姓名></xsl:模板><xsl:template match="描述"><pd:描述><xsl:value-of select="."/></pd:描述></xsl:模板></xsl:stylesheet>

更新 2:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:pd="namespace2"><xsl:output method="xml" indent="yes"/><xsl:template match="/"><根><xsl:apply-templates/></root></xsl:模板><xsl:template match="book"><Book xmlns="namespace1"><xsl:apply-templates/></xsl:模板><xsl:template match="name"><名称 xmlns="namespace1"><xsl:value-of select="."/></姓名></xsl:模板><xsl:template match="描述"><pd:描述><xsl:value-of select="."/></pd:描述></xsl:模板></xsl:stylesheet>

更新 3:这个 XSLT:

<xsl:output method="xml" indent="yes"/><xsl:template match="/"><根><xsl:apply-templates/></root></xsl:模板><xsl:template match="book"><pd:Book xmlns:pd="namespace2"><xsl:apply-templates/></pd:Book></xsl:模板><xsl:template match="name"><pd:Name xmlns:pd="namespace2"><xsl:value-of select="."/></pd:姓名></xsl:模板><xsl:template match="描述"><pd:描述 xmlns:pd="namespace2"><xsl:value-of select="."/></pd:描述></xsl:模板></xsl:stylesheet>

输出 XML(就像在您的更新 2 中,我使用 MSXML 6.0),但对于 XML 引擎,无论命名空间在哪里定义:

<pd:Book xmlns:pd="namespace2"><pd:Name>A</pd:Name><pd:描述>A1</pd:描述></pd:Book><pd:Book xmlns:pd="namespace2"><pd:Name>B</pd:Name><pd:描述>B1</pd:描述></pd:Book></root>

I have a huge xml file that I would like to split up into individual xml documents; each individual xml file is supposed to have an explicit namespace declaration where applicable as show in the "Desired Output" portion below. However, I keep getting the error "namespace error : Namespace prefix bd on keyword is not defined"

My question is, how can I explicitly tell my XSLT processor where to put namespace declaration in resulting output? I have gone through a couple of tutorials online, but I can't quite figure out how to sort this out.

Partial XSLT Snippet

...
...
<xsl:template match="chapter">
  <bd:chapter>
    <xsl:apply-templates select="name" />
    <xsl:apply-templates select="page" />
  </bd:chapter>
</xsl:template>

<xsl:template match="name">
  <bd:name>
    <xsl:value-of select="." />
  </bd:name>
</xsl:template>
...
...

Desired Output

<?xml version="1.0" encoding="utf-8" ?>
<books>
<bd:book xmlns:bd="http://www.bd.org.za/db" xmlns:cd="http://www.bd.org.za/cd">
    <bd:name>book01</bd:name>
    <bd:chapter>
      <cd:name>chapter01<cd:name>
      <bd:page>
    <cd:title></cd:title>
    <pd:description></pd:description>
      </bd:page>
    </bd:chapter>
</bd:book>
...
...
...
</books>

Update #1

<?xml version="1.0" encoding="utf-8" ?>
<books>
<book>
    <name>book01</name>
    <chapter>
      <name>chapter01<name>
      <page>
    <title></title>
    <description></description>
      </page>
    </chapter>
</book>
...
...
...
</books>

Update #2

@polishchuk Update2 give the following result

<?xml version="1.0"?>
<root xmlns:pd="namespace2">
  <pd:Book xmlns:pd="http://namespace1.org/">
    <pd_1:Name xmlns:pd="namespace2" xmlns:pd_1="http://namespace1.org/">A</pd_1:Name>
    <pd:Description xmlns:pd="namespace2">A1</pd:Description>
  </pd:Book>
  <pd:Book xmlns:pd="http://namespace1.org/">
    <pd_1:Name xmlns:pd="namespace2" xmlns:pd_1="http://namespace1.org/">B</pd_1:Name>
    <pd:Description xmlns:pd="namespace2">B1</pd:Description>
  </pd:Book>
</root>

The only pace I would like the namespaces to appear is within the book node. Please see below

<?xml version="1.0"?>
<root>
  <pd:Book xmlns:pd="http://namespace1.org/">
    <pd:Name >A</pd:Name>
    <pd:Description>A1</pd:Description>
  </pd:Book>
  <pd:Book xmlns:pd="http://namespace1.org/">
    <pd:Name>B</pd_1:Name>
    <pd:Description>B1</pd:Description>
  </pd:Book>
</root>

解决方案

Suppose you have following XML:

<root>
  <book>
    <name>A</name>
    <description>A1</description>
  </book>
  <book>
    <name>B</name>
    <description>B1</description>
  </book>
</root>

Desired XML (with namespaces):

<root xmlns:bd="namespace1" xmlns:pd="namespace2">
  <bd:Book>
    <bd:Name>A</bd:Name>
    <pd:Description>A1</pd:Description>
  </bd:Book>
  <bd:Book>
    <bd:Name>B</bd:Name>
    <pd:Description>B1</pd:Description>
  </bd:Book>
</root>

Appropriate XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:bd="namespace1"
                xmlns:pd="namespace2"
                >
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <root>
      <xsl:apply-templates/>
    </root>
  </xsl:template>

  <xsl:template match="book">
    <bd:Book>
      <xsl:apply-templates />
    </bd:Book>
  </xsl:template>

  <xsl:template match="name">
    <bd:Name>
      <xsl:value-of select="."/>
    </bd:Name>
  </xsl:template>

  <xsl:template match="description">
    <pd:Description>
      <xsl:value-of select="."/>
    </pd:Description>
  </xsl:template>

</xsl:stylesheet>

You simply add namespaces in XSLT, then create nodes using namespace's prefix.

Update 1:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:pd="namespace2"
                >
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <root>
      <xsl:apply-templates/>
    </root>
  </xsl:template>

  <xsl:template match="book">
    <bd:Book xmlns:bd="namespace1">
      <xsl:apply-templates />
    </bd:Book>
  </xsl:template>

  <xsl:template match="name">
    <bd:Name xmlns:bd="namespace1">
      <xsl:value-of select="."/>
    </bd:Name>
  </xsl:template>

  <xsl:template match="description">
    <pd:Description>
      <xsl:value-of select="."/>
    </pd:Description>
  </xsl:template>

</xsl:stylesheet>

Update 2:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:pd="namespace2"
                >
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <root>
      <xsl:apply-templates/>
    </root>
  </xsl:template>

  <xsl:template match="book">
    <Book xmlns="namespace1">
      <xsl:apply-templates />
    </Book>
  </xsl:template>

  <xsl:template match="name">
    <Name xmlns="namespace1">
      <xsl:value-of select="."/>
    </Name>
  </xsl:template>

  <xsl:template match="description">
    <pd:Description>
      <xsl:value-of select="."/>
    </pd:Description>
  </xsl:template>

</xsl:stylesheet>

Update 3: This XSLT:

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

  <xsl:template match="/">
    <root>
      <xsl:apply-templates/>
    </root>
  </xsl:template>

  <xsl:template match="book">
    <pd:Book xmlns:pd="namespace2">
      <xsl:apply-templates />
    </pd:Book>
  </xsl:template>

  <xsl:template match="name">
    <pd:Name  xmlns:pd="namespace2">
      <xsl:value-of select="."/>
    </pd:Name>
  </xsl:template>

  <xsl:template match="description">
    <pd:Description  xmlns:pd="namespace2">
      <xsl:value-of select="."/>
    </pd:Description>
  </xsl:template>

</xsl:stylesheet>

Output XML (like in your Update 2, I use MSXML 6.0), but for XML engine no matter where namespace is defined:

<root>
  <pd:Book xmlns:pd="namespace2">
    <pd:Name>A</pd:Name>
    <pd:Description>A1</pd:Description>
  </pd:Book>
  <pd:Book xmlns:pd="namespace2">
    <pd:Name>B</pd:Name>
    <pd:Description>B1</pd:Description>
  </pd:Book>
</root>

这篇关于命名空间错误:未定义关键字上的命名空间前缀 bd的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆