2012-01-24 85 views
-2

我正在尋找一種方法來使用xslt從xml文件中替換字段的值。除了命名空間前綴以外,一切都很好。在下面的源文件中,我想更改密碼元素值。如何用XSLT替換元素通過保留名稱空間前綴

<?xml version="1.0" encoding="utf-8"?> 
<ns0:MYXML xmlns:ns0="http://www.me.com/myxml" xmlns="http://www.me.com/myxml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns0:Header> 
     <ns0:Infromation> 
      <ns0:From> 
       <ns0:Credential> 
        <ns0:User>jeff</ns0:User> 
        <Password xmlns="">OLD VALUE</Password> 
       </ns0:Credential> 
      </ns0:From> 
     </ns0:Infromation> 
     <ns0:Misc> 
      <ns0:ID>1002</ns0:ID> 
      <ns0:Timestamp>2012-01-16T09:23:33</ns0:Timestamp> 
      <ns0:Type>unknown</ns0:Type> 
     </ns0:Misc> 
     <ns0:State> 
      <ns0:ConversationId>d66d9304-9025-a580-e111-5640bf36560d</ns0:ConversationId> 
     </ns0:State> 
    </ns0:Header> 
</ns0:MYXML> 

這裏是我的結果:

<?xml version="1.0" encoding="utf-8"?> 
<ns0:MYXML xmlns:ns0="http://www.me.com/myxml" xmlns="http://www.me.com/myxml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns0:Header> 
     <ns0:Infromation> 
      <ns0:From> 
       <ns0:Credential> 
        <ns0:User>jeff</ns0:User> 
        <Password xmlns="">New Value</Password> 
       </ns0:Credential> 
      </ns0:From> 
     </ns0:Infromation> 
     <ns0:Misc> 
      <ns0:ID>1002</ns0:ID> 
      <ns0:Timestamp>2012-01-16T09:23:33</ns0:Timestamp> 
      <ns0:Type>unknown</ns0:Type> 
     </ns0:Misc> 
     <ns0:State> 
      <ns0:ConversationId>d66d9304-9025-a580-e111-5640bf36560d</ns0:ConversationId> 
     </ns0:State> 
    </ns0:Header> 
</ns0:MYXML> 

這就是今天的XSLT代碼,我使用的轉型:

<?xml version="1.0" encoding="utf-8"?> 
<ns0:MYXML xmlns:ns0="http://www.me.com/myxml" xmlns="http://www.me.com/myxml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns0:Header> 
     <ns0:Infromation> 
      <ns0:From> 
       <ns0:Credential> 
        <ns0:User>jeff</ns0:User> 
        <Password xmlns="">New Value</Password> 
       </ns0:Credential> 
      </ns0:From> 
     </ns0:Infromation> 
     <ns0:Misc> 
      <ns0:ID>1002</ns0:ID> 
      <ns0:Timestamp>2012-01-16T09:23:33</ns0:Timestamp> 
      <ns0:Type>unknown</ns0:Type> 
     </ns0:Misc> 
     <ns0:State> 
      <ns0:ConversationId>d66d9304-9025-a580-e111-5640bf36560d</ns0:ConversationId> 
     </ns0:State> 
    </ns0:Header> 
</ns0:MYXML> 

我試圖用 「{名()}」 爲元素名稱,但這會引發該名稱空間不存在的異常。

任何幫助,非常感謝!

+0

重複問:請參見本:: http://stackoverflow.com/questions/3147876/how-to-preserve-xml-namespace-in- xslt-output –

+2

你還沒有說出你想要的輸出。我們唯一知道的關於你想要的輸出的是,它不是你實際得到的輸出。回答問題。 –

回答

0

我不清楚你是否希望Password元素屬於空的名稱空間,因爲它出現在原始Xml中,或者您希望它位於http://www.me.com/myxml名稱空間中。這裏是一個XSLT樣式表,從來自http://www.me.com/myxml命名空間的密碼元素的空命名空間替換密碼元素(我用NS0前綴,以便它看起來像XML文檔中的其他元素):

<?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" exclude-result-prefixes="msxsl"> 

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

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Password"> 
    <ns0:Password xmlns:ns0="http://www.me.com/myxml"> 
     <xsl:copy-of select="@*"/> 
     <xsl:text>New Value</xsl:text> 
    </ns0:Password> 
    </xsl:template> 

    <!-- This creates the element in the empty namespace 
    <xsl:template match="Password"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:text>New Value</xsl:text> 
    </xsl:copy> 
    </xsl:template> 
    --> 
</xsl:stylesheet> 

我也包括在內一個複製現有密碼元素並在需要時替換其值的模板。如果你不需要它,你可以完全刪除該塊。 這裏是轉換結果:

<?xml version="1.0" encoding="utf-8"?> 
<ns0:MYXML xmlns:ns0="http://www.me.com/myxml" xmlns="http://www.me.com/myxml" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns0:Header> 
    <ns0:Infromation> 
     <ns0:From> 
     <ns0:Credential> 
      <ns0:User>jeff</ns0:User> 
      <ns0:Password>New Value</ns0:Password> 
     </ns0:Credential> 
     </ns0:From> 
    </ns0:Infromation> 
    <ns0:Misc> 
     <ns0:ID>1002</ns0:ID> 
     <ns0:Timestamp>2012-01-16T09:23:33</ns0:Timestamp> 
     <ns0:Type>unknown</ns0:Type> 
    </ns0:Misc> 
    <ns0:State> 
     <ns0:ConversationId>d66d9304-9025-a580-e111-5640bf36560d</ns0:ConversationId> 
    </ns0:State> 
    </ns0:Header> 
</ns0:MYXML> 

帕維爾

相關問題