如何使用像(xmlns:json)这样的疯狂命名空间创建XML输出

时间:2013-12-10 10:40:03

标签: xml xslt namespaces

我有以下输入(没有命名空间):

XML输入

   <book>
     <title>foo</title>
     <title>foo2</title>
    </book>

我需要使用 XSL转换创建以下输出:

XML输出

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:json="http://json.org/">
   <data json:force-array="true">
     <label>foo</label>
      <label>foo2</label>
   </data>
</root>

我当前的XSL样式表如下所示:

* XSL样式表*

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:json="http://json.org/"
    xmlns="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="">

<xsl:output method="xml" indent="yes"/>


<xsl:template match="book">
        <xsl:element name="root" namespace="json">
        <xsl:attribute name="json">http://json.org/</xsl:attribute>

    <xsl:element name="data" namespace="json">
        <xsl:attribute name="json:force-array" namespace="json">true</xsl:attribute>

<xsl:for-each select="child::title">
    <xsl:element name="label"><xsl:value-of select="."/></xsl:element>
</xsl:for-each>
        </xsl:element>  
</xsl:element>
</xsl:template>
</xsl:stylesheet>

此XSL提供以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="json" json="http://json.org/">
   <data xmlns:json="json" json:force-array="true">
      <label xmlns="http://www.w3.org/1999/xhtml">foo</label>
      <label xmlns="http://www.w3.org/1999/xhtml">foo2</label>
   </data>
</root>

我的三个问题是:

  • 如何删除元素上的xmlns属性
  • 如何创建 @xmlns:json 属性?
  • 如何删除元素上的 @xmlns:json =“json”属性?

我正在使用saxon9he解析器。

提前致谢! (我变得疯了!)

2 个答案:

答案 0 :(得分:1)

我不确定你为什么这么努力工作。使用您的示例输入,这个简单的样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/book">
    <root xmlns:json="http://json.org/">
        <data json:force-array="true">
            <xsl:for-each select="title">
                <label>
                    <xsl:value-of select="."/>
                </label>
            </xsl:for-each>
        </data> 
    </root>  
</xsl:template>
</xsl:stylesheet> 

将产生指定的输出。请注意,<stylesheet>元素中没有名称空间声明,除了必需的xsl。

答案 1 :(得分:0)

这一行:

xmlns="http://www.w3.org/1999/xhtml"

为所有元素指定默认命名空间(在本例中为XHTML)。使用简单的输入和输出XML,您似乎没有使用默认命名空间。

另请注意样式表中的这一行:

<xsl:attribute name="json">http://json.org/</xsl:attribute>

不表示命名空间。相反,它被解释为名为“json”的普通属性,其URL为其值。

此样式表可根据需要输出XML。

<?xml version="1.0" encoding="utf-8"?>

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

<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="book">
  <xsl:element name="json:root">
     <xsl:element name="data">
        <xsl:attribute name="json:force-array">
           <xsl:text>true</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
     </xsl:element>
  </xsl:element>
</xsl:template>

<xsl:template match="title">
  <xsl:element name="label">
     <xsl:value-of select="."/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

这会产生以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<json:root xmlns:json="http://json.org/">
  <data json:force-array="true">
   <label>foo</label>
   <label>foo2</label>
  </data>
</json:root>