2014-10-30 164 views
0

我在通過xslt 2.0將輸入xml轉換爲oputput xml時遇到了一個問題。以下是輸入XML如何在XSLT 2.0中添加多個名稱空間聲明

<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,棱鏡,MGH?請讓我知道,如果您需要更多的信息,因爲我對於SO相當陌生,並且非常感謝您能否幫助我。

回答

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:*元素,你不得不重複xmlns:dc那裏。總的來說,我發現把所有的聲明放在根上更容易,除非你有特定的理由不要。

+0

感謝您的答覆。雖然我嘗試通過在根中添加所有名稱空間聲明來嘗試您的方法,但在嘗試執行轉換時它仍會給我以下錯誤。 **前綴「dc」的命名空間尚未聲明** – 2014-10-30 14:53:08

+0

@PawanSaha它抱怨樣式表還是關於輸入XML文檔?你可能在_input_中有''元素而沒有'xmlns:dc'聲明? – 2014-10-30 15:25:44

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> 
相關問題