2014-02-27 90 views
0

XSLT非常新穎,需要XSLT轉換的幫助,我無法正常工作。我遇到的問題是轉換後的文檔出現空白的CONO和CUNO元素。我的XSLT無法正常工作

我一直在使用http://www.w3schools.com/xsl/xsl_value_of.asp作爲指導,但它似乎並沒有工作。

這裏是原始的XML。

<?xml version="1.0" encoding="utf-8"?> 
<GetBasicData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="CRS610MI"> 
<CONO xmlns="">1</CONO> 
<CUNO xmlns="">123456</CUNO> 
</GetBasicData> 

這裏是我的XSLT

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml"/> 
<xsl:template match="/"> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
<soap:Body> 
<GetBasicData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="CRS610MI"> 
<CONO xmlns=""> 
<xsl:value-of select="GetBasicData/CONO"/> 
</CONO> 
<CUNO xmlns=""> 
<xsl:value-of select="GetBasicData/CUNO"/> 
</CUNO> 
</GetBasicData> 
</soap:Body> 
</soap:Envelope> 
</xsl:template> 
</xsl:stylesheet> 

下面是我使用轉型

private static Boolean TransformXML(XPathDocument xPathDocument, String xslPath, out XmlDocument xmlDocument) 
    { 
     try 
     { 
      using (MemoryStream memoryStream = new MemoryStream()) 
      { 
       using (StreamWriter streamWriter = new StreamWriter(memoryStream)) 
       { 
        XmlWriter xmlWriter = XmlWriter.Create(streamWriter); 

        XsltSettings xsltSettings = new XsltSettings(); 
        xsltSettings.EnableScript = true; 

        XslCompiledTransform xslCompiledTransform = new XslCompiledTransform(); 
        xslCompiledTransform.Load(xslPath, xsltSettings, null); 
        xslCompiledTransform.Transform(xPathDocument, xmlWriter); 

        memoryStream.Position = 0; 

        StreamReader streamReader = new StreamReader(memoryStream); 

        XmlReader xmlReader = XmlReader.Create(streamReader); 

        xmlDocument = new XmlDocument(); 
        xmlDocument.Load(xmlReader); 
       } 
      } 
     } 
     catch (Exception exception) 
     { 
      Debug.WriteLine(exception); 

      xmlDocument = null; 

      return false; 
     } 

     return true; 
    } 
+0

「GetBasicData」 和 「坤諾」 節點具有不同的命名空間* *(未命名空間前綴) - 你不可能選擇它「GetBasicData/CUNO」XPath。 –

+0

我有什麼選擇?我無法更改XML輸入文檔。所以我需要在轉型中做到這一點。 – Matthew

+0

您需要爲XPath指定正確的前綴(無法記住XSLT中是否有特殊的或者只是常規前綴都可以)或者使用'local-name' hack來忽略名稱空間。在MSDN上檢查我們的[Xml命名空間...和XSLT](http://msdn.microsoft.com/en-us/library/ms950779.aspx)。 –

回答

1

在你輸入XML的C#代碼中,GetBasicData元素有a_default namespace_(這恰好成爲「CRS610MI」)。另一方面,CONOCUNO元素沒有名稱空間。

將名稱空間聲明添加到樣式表。另外,輸出選項indent="yes"使輸出更易於閱讀。

看起來您的意圖是將輸入XML放入soap:Body之內而不更改內容。在這種情況下,您不必重新定義XSLT樣式表中的所有內容 - 儘可能從原始XML中複製。

樣式

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:crs="CRS610MI" exclude-result-prefixes="crs"> 

<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <soap:Body> 
    <xsl:apply-templates select="node()|@*"/> 
    </soap:Body> 
    </soap:Envelope> 
</xsl:template> 

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

</xsl:stylesheet> 

輸出

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <soap:Body> 
     <GetBasicData xmlns="CRS610MI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <CONO xmlns="">1</CONO> 
     <CUNO xmlns="">123456</CUNO> 
     </GetBasicData> 
    </soap:Body> 
</soap:Envelope> 
+0

+1看起來正確。你也可能需要在'CONO' /'CUNO'的XPath中使用前綴(我也認爲「crs:GetBasicData/CONO」是正確的) –

+0

@AlexeiLevenkov你會在前綴中添加什麼? –

+0

你是對的......他們有一個空的名字空間 - 沒有前綴是正確的。 (一個可能可以定義'xmlns:foo =「」'並使用它,但看起來很奇怪) –