在XML结果中排除命名空间

lig*_*iri 3 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>
Run Code Online (Sandbox Code Playgroud)

当前的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>
Run Code Online (Sandbox Code Playgroud)

电流输出

  <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>
Run Code Online (Sandbox Code Playgroud)

期望的输出

<?xml version="1.0" encoding="UTF-8"?>
  <title>Book Title</title>
  <page>page001</page>
  <page>page002</page>
  <page>page001</page>
  <page>page002</page>
Run Code Online (Sandbox Code Playgroud)

Car*_*com 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>
Run Code Online (Sandbox Code Playgroud)


Dim*_*hev 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>
Run Code Online (Sandbox Code Playgroud)

当应用于提供的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>
Run Code Online (Sandbox Code Playgroud)

产生想要的,正确的结果:

<page>
    <title>Book Title</title>
    <page>page001</page>
    <page>page002</page>
    <page>page001</page>
    <page>page002</page>
</page>
Run Code Online (Sandbox Code Playgroud)

说明:

  1. 使用该xsl:element指令创建(不复制!)名称为local-name()匹配元素的新元素.

  2. local-name() number "重命名"它们的模板匹配元素page