2013-06-18 160 views
0

這是我的新(編輯)更完整的場景: 我得到了一個xml,它將用xsl進行轉換。我得到了來自客戶,看起來像一個例子: XML是INFILE:如何使用xsl在xml中顯示名稱空間?

<?xml version="1.0" encoding="utf-8"?> 
<xsi:myCompanyImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <tns:myCompanyHeader xmlns:tns="http://www.MyComp.se/myCompany"> 
    <tns:sentFr>123456</tns:sentFr> 
    </tns:myCompanyHeader> 
    <tns:myCompanyUsers xmlns:tns="http://www.MyComp.se/myCompany"> 
    <tns:myCompanyUser ssn="1234567890"> 
     <tns:firstName>John</tns:firstName> 
    </tns:myCompanyUser> 
    </tns:myCompanyUsers> 
</xsi:myCompanyImport> 

XSL文件:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:tns="http://www.MyComp.se/myCompany" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://www.MyComp.se/myCompany myCompanyUsers.xsd" 
           xmlns:local="urn:cs"> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
    <xsl:template match="/"> 
     <xsl:element name="xsi:myCompanyImport" namespace="http://www.w3.org/2001/XMLSchema-instance"> 
      <!--Start Header--> 
      <xsl:element name="tns:myCompanyHeader" > 
       <xsl:element name="tns:sentFr" > 
        <xsl:value-of select="_x0023_MyComp_header/@SentFrom" /> 
       </xsl:element> 
      </xsl:element> 
      <!--End Header--> 

      <!--Start Users--> 
      <xsl:element name="tns:myCompanyUsers"> 
       <!--Loop through persons--> 
       <xsl:for-each select="_x0023_MyComp_header/_x0023_MyComp_Employee"> 
        <xsl:element name="tns:myCompanyUser" > 
         <xsl:attribute name="ssn"> 
          <xsl:value-of select="@inSsn" /> 
         </xsl:attribute> 
         <xsl:element name="tns:firstName" > 
          <xsl:value-of select="@inFname"/> 
         </xsl:element> 
        </xsl:element> 
       </xsl:for-each> 
       <!--End Loop--> 
      </xsl:element> 
      <!--End Users--> 

     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

(沒關係有關在XSL的Csharp的代碼,它用於目的這裏沒有顯示) 所以,結果是現在:

<?xml version="1.0" encoding="utf-8"?> 
<xsi:myCompanyImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <tns:myCompanyHeader xmlns:tns="http://www.MyComp.se/myCompany"> 
    <tns:sentFr>123456</tns:sentFr> 
    </tns:myCompanyHeader> 
    <tns:myCompanyUsers xmlns:tns="http://www.MyComp.se/myCompany"> 
    <tns:myCompanyUser ssn="1234567890"> 
     <tns:firstName>John</tns:firstName> 
    </tns:myCompanyUser> 
    </tns:myCompanyUsers> 
</xsi:myCompanyImport> 

但客戶希望:

<?xml version="1.0" encoding="utf-8"?> 
<xsi:myCompanyImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <tns:myCompanyHeader xmlns:tns="http://www.MyComp.se/myCompany"> 
    <tns:sentFr>123456</tns:sentFr> 
    </tns:myCompanyHeader> 
    <tns:myCompanyUsers xmlns:tns="http://www.MyComp.se/myCompany" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.maxm.se/myCompany myCompanyUsers.xsd"> 
    <tns:myCompanyUser ssn="1234567890"> 
     <tns:firstName>John</tns:firstName> 
    </tns:myCompanyUser> 
    </tns:myCompanyUsers> 
</xsi:myCompanyImport> 

我該如何在xsl中編寫這個以便在xml中顯示?我嘗試了許多不同的方式,但沒有成功。它實際上只是那些2線我會增加TNS:myCompanyUsers:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.maxm.se/myCompany myCompanyUsers.xsd"> 

我想,但沒有成功!

+0

您確定用戶數據位於xsi名稱空間嗎?這完全是奇怪的。但是很難爲您提供更多幫助,我無法看到您想要的轉換結果。 –

+0

Ehm。好吧,他們幾次改變了他們的要求,每次我們和他們交談,我都會得到新的信息。我會在一段時間內提出一個更完整的方案。 – user2497316

回答

2

我該如何在xsl中寫這個以便在xml中顯示?

寫它的字面,即代替

<xsl:element name="myns:myCustomerUsers" > 

使用

<myns:myCustomerUsers xmlns:tns="http://www.myCustomerWeb.se/myCustomer" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.myCustomerWeb.se/myCustomer myexuser.xsd"> 

或僅僅作爲

<myns:myCustomerUsers 
    xsi:schemaLocation="http://www.myCustomerWeb.se/myCustomer myexuser.xsd"> 

因爲文字結果元素繼承了範圍的命名空間節點在樣式表中的這一點(在你的案例,在<xsl:stylesheet>上宣佈的那些)。您可能需要將exclude-result-prefixes="msxsl"添加到您的<xsl:stylesheet>元素中,否則myns:myCustomerUsers元素也將獲得xmlns:msxsl="urn:schemas-microsoft-com:xslt"聲明。

當元素名稱不是常量時,只需要使用<xsl:element>

+0

我只是把一個更完整的代碼示例abowe。 – user2497316

+0

@ user2497316同樣的建議適用 - 如果你有一個固定名稱的特定元素,你想包含在輸出中,然後把它作爲一個文字元素放在樣式表中,除非你想要''''動態構建元素的名稱。 –

+0

對不起,我沒有正確閱讀你的第一個答案。當然你是對的,我把它寫在標籤中,然後violá! 非常感謝。 J – user2497316