在XML结果中排除命名空间

时间:2011-07-29 13:57:16

标签: xslt

我试图弄清楚如何最好地处理下面的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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

此转化

<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