Исключение пространств имен в результатах XML - PullRequest
3 голосов
/ 29 июля 2011

Я пытаюсь выяснить, как лучше всего обработать XML-файл ниже, чтобы полученный XML-файл исключал объявления пространства имен.

Ввод XML

<?xml version="1.0" encoding="UTF-8"?>
<page xmlns:b="http://book.com/" xmlns:p="http://page.com/">
  <b:title>Book Title</b:title>
  <p:number>page001</p:number>
  <p:number>page002</p:number>
  <p:number>page001</p:number>
  <p:number>page002</p:number>
</page>

Текущий XSL-файл

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:b="http://book.com/" 
xmlns:p="http://page.com/"
>

 <xsl:output method="xml" indent="yes" encoding="UTF-8" />

 <xsl:template match="resource">
   <xsl:apply-templates select="b:title" />
   <xsl:apply-templates select="p:number" />
 </xsl:template>

 <xsl:template match="b:title">
   <title exclude-result-prefixes="#all">
     <xsl:value-of select="." />
   </title>
 </xsl:template>

 <xsl:template match="p:number">
   <page exclude-result-prefixes="#all">
     <xsl:value-of select="." />
   </page>
 </xsl:template>

</xsl:stylesheet>

Токовый выход

  <title xmlns:b="http://book.com/" xmlns:p="http://page.com/" exclude-result-prefixes="#all">Book Title</title>
  <page xmlns:b="http://book.com/" xmlns:p="http://page.com/" exclude-result-prefixes="#all">page001</page>
  <page xmlns:b="http://book.com/" xmlns:p="http://page.com/" exclude-result-prefixes="#all">page002</page>
  <page xmlns:b="http://book.com/" xmlns:p="http://page.com/" exclude-result-prefixes="#all">page001</page>
  <page xmlns:b="http://book.com/" xmlns:p="http://page.com/" exclude-result-prefixes="#all">page002</page>

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

<?xml version="1.0" encoding="UTF-8"?>
  <title>Book Title</title>
  <page>page001</page>
  <page>page002</page>
  <page>page001</page>
  <page>page002</page>

Ответы [ 2 ]

5 голосов
/ 29 июля 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:template match="*">
  <xsl:element name="{local-name()}">
   <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="*[local-name()='number']">
  <page>
   <xsl:value-of select="."/>
  </page>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<page xmlns:b="http://book.com/" xmlns:p="http://page.com/">
    <b:title>Book Title</b:title>
    <p:number>page001</p:number>
    <p:number>page002</p:number>
    <p:number>page001</p:number>
    <p:number>page002</p:number>
</page>

дает желаемый, правильный результат :

<page>
    <title>Book Title</title>
    <page>page001</page>
    <page>page002</page>
    <page>page001</page>
    <page>page002</page>
</page>

Объяснение

  1. Использование инструкции xsl:element для создания (не копирования!) Нового элемента с именем local-name() соответствующего элемента.

  2. Шаблон, соответствующий элементам с local-name() number, чтобы «переименовать» их в page

5 голосов
/ 29 июля 2011

Используйте атрибут exclude-result-prefixes в элементе xsl:stylesheet.

В вашем случае что-то вроде:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:b="http://book.com/" 
xmlns:p="http://page.com/"
exclude-result-prefixes="b p"
>

 <xsl:output method="xml" indent="yes" encoding="UTF-8" />

 <xsl:template match="resource">
   <xsl:apply-templates select="b:title" />
   <xsl:apply-templates select="p:number" />
 </xsl:template>

 <xsl:template match="b:title">
   <title>       
     <xsl:value-of select="." />       
   </title>
 </xsl:template>

 <xsl:template match="p:number">       
   <page>
     <xsl:value-of select="." />       
   </page>
 </xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...