ошибка пространства имен: префикс пространства имен bd для ключевого слова не определен - PullRequest
3 голосов
/ 23 июля 2011

У меня есть огромный XML-файл, который я хотел бы разделить на отдельные XML-документы;Предполагается, что каждый отдельный XML-файл должен иметь явное объявление пространства имен, где это применимо, как показано в разделе «Желаемый вывод» ниже.Тем не менее, я получаю сообщение об ошибке «ошибка пространства имен: префикс пространства имен bd для ключевого слова не определен»

У меня вопрос, как я могу явно указать моему процессору XSLT, куда поместить объявление пространства имен в результирующем выводе?Я просмотрел несколько учебных пособий в Интернете, но не могу понять, как с этим разобраться.

Частичный фрагмент XSLT

...
...
<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>
...
...

Желаемый вывод

<?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>

Обновление № 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>

Обновление № 2

@ polishchuk Update2 дает следующий результат

<?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>

Единственный темп, в котором я хотел бы, чтобы пространства имен появлялись, - внутри узла книги.Пожалуйста, смотрите ниже

<?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>

1 Ответ

2 голосов
/ 23 июля 2011

Предположим, у вас есть следующий XML:

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

Желаемый XML (с пространствами имен):

<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>

Подходящий 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>

Вы просто добавляете пространства имен в 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="/">
    <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>

Обновление 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>

Обновление 3 : Это 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>

Вывод XML (как в вашем обновлении 2, я использую MSXML 6.0), но для механизма XML независимо от того, где определено пространство имен:

<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>
...