如何在XSLT 2.0中添加多个名称空间声明

时间:2014-10-30 14:31:59

标签: xml xslt xslt-2.0 transformation

我在通过xslt 2.0将输入xml转换为oputput xml时遇到了问题。以下是输入xml

<Heard sequence_id="10363284">
   <doctype>News</doctype>
   <Banner>--Alert--</Banner>
   <PCategory>WW</PCategory>
   <Topic>XX,YY,ZZ</Topic>
   <type>RealTime</type>
   <headline>xxxxxxxxxxxxxxxxxx</headline>
   <TextBody>xxxxxxxxx</TextBody>
   <headline_datetime>2014-09-09T10:51:27-04:00</headline_datetime>
   <service_line>ABC</service_line>
   <page_num>123</page_num>
</Heard>

预期的输出应为

<mgh:message xsi:schemaLocation="http://comp.com/prismPlus-XSD HeardsContent.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:prism="http://prismstandard.org/namespaces/basic/2.0" xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:prl="http://prismstandard.org/namespaces/prl/2.0" xmlns:mgh="http://comp.com/prismPlus-XSD">           
    <mgh:article>       
        <mgh:head>
            <dc:identifier>10363284</dc:identifier>
            <dc:title>xxxxxxxxxxxxxxxxxx</dc:title>
            <dc:publisher>Comp</dc:publisher>
            <dc:subject>--Alert--</dc:subject>
            <prism:publicationDate>09/08/2014</prism:publicationDate>
            <prism:subsection1>News</prism:subsection1>
            <prism:keyword>XX,YY,ZZ</prism:keyword>
            <mgh:category>WW</mgh:category>
            <mgh:serviceLine>ABC</mgh:serviceLine>
            <mgh:pageNumber>123</mgh:pageNumber>
        </mgh:head>
        <mgh:contentFeatureBody>
            <body>
                xxxxxxxxxxxxxxxxxxxx
            </body>
        </mgh:newsFeatureBody>                  
    </mgh:article>    
</mgh:message>

在xslt 2.0中,如何添加多个名称空间,如 dc,prism,mgh ?如果您需要其他信息,请告诉我,因为我对SO很新,如果您能帮助我,我们将非常感谢。

2 个答案:

答案 0 :(得分:2)

如果你正在创建mgh:message作为文字结果元素,那么提供这些命名空间声明的范围应该在它应该工作的适当位置:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:prism="http://prismstandard.org/namespaces/basic/2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1"
    xmlns:prl="http://prismstandard.org/namespaces/prl/2.0"
    xmlns:mgh="http://comp.com/prismPlus-XSD">

  <xsl:template match="/">
    <mgh:message xsi:schemaLocation="http://comp.com/prismPlus-XSD HeardsContent.xsd">
      <!-- etc -->

因为文字结果元素保留样式表中该点范围内的名称空间。

您当然可以将声明放在mgh:message元素本身而不是xsl:stylesheet上,但如果您在另一个模板中创建dc:*元素,则可以#39; d也必须在那里重复xmlns:dc。总的来说,我发现将所有声明放在根目录更容易,除非你有特殊的理由不这样做。

答案 1 :(得分:0)

将名称空间和别名投影到输出文档中并不是特别的秘密 - 与其他xml文档一样,在根元素中声明它们,然后使用别名。 AFAIK schemaLocation需要手动映射到根元素作为属性。这是一个基本的骨架模板(请注意,我已经跳过了大部分元素)

<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:prism="http://prismstandard.org/namespaces/basic/2.0" 
                xmlns:dc="http://purl.org/dc/elements/1.1" 
                xmlns:prl="http://prismstandard.org/namespaces/prl/2.0" 
                xmlns:mgh="http://comp.com/prismPlus-XSD">

    <xsl:template match="/Heard">
    <mgh:message> <!--OR of course <msh xmlns="...">-->
       <xsl:attribute name="schemaLocation" 
                      namespace="http://www.w3.org/2001/XMLSchema-instance"
                      >http://comp.com/prismPlus-XSD HeardsContent.xsd</xsl:attribute>
      <mgh:article>
        <mgh:head>
          <dc:identifier>
            <xsl:value-of select="some/path/to/value"></xsl:value-of>
          </dc:identifier>
          <prism:keyword>
            <xsl:value-of select="Topic"></xsl:value-of>
          </prism:keyword>
        </mgh:head>
        <mgh:contentFeatureBody>
          <body> <!--Note, global namespace so no alias or xmlns-->
            <xsl:value-of select="TextBody"></xsl:value-of>
          </body>
        </mgh:contentFeatureBody>
      </mgh:article>
    </mgh:message>
  </xsl:template>
</xsl:stylesheet>

这会产生以下输出xml:

<?xml version="1.0" encoding="utf-8"?>
<mgh:message xsi:schemaLocation="http://comp.com/prismPlus-XSD HeardsContent.xsd" 
             xmlns:mgh="http://comp.com/prismPlus-XSD" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:prism="http://prismstandard.org/namespaces/basic/2.0" 
             xmlns:dc="http://purl.org/dc/elements/1.1" 
             xmlns:prl="http://prismstandard.org/namespaces/prl/2.0">
  <mgh:article>
    <mgh:head>
      <dc:identifier></dc:identifier>
      <prism:keyword>XX,YY,ZZ</prism:keyword>
    </mgh:head>
    <mgh:contentFeatureBody>
      <body>xxxxxxxxx</body>
    </mgh:contentFeatureBody>
  </mgh:article>
</mgh:message>