2017-09-23 34 views
0

使用XSLT執行3級別的XML文檔排序後。我無法制作我的排序XML的副本。我原來的XML是:如何使用XSLT複製XML以生成另一種相同形式的新XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Root> 

    <Test> 
    <TestPhase>5</TestPhase> 
    <TestFlow>9</TestFlow> 
    <TestParameter>5</TestParameter> 
    </Test> 

    <Test> 
    <TestPhase>5</TestPhase> 
    <TestFlow>9</TestFlow> 
    <TestParameter>2</TestParameter> 
    </Test> 

    <Test> 
    <TestPhase>1</TestPhase> 
    <TestFlow>3</TestFlow> 
    <TestParameter>1</TestParameter> 
    </Test> 

    <Test> 
    <TestPhase>1</TestPhase> 
    <TestFlow>2</TestFlow> 
    <TestParameter>2</TestParameter> 
    </Test> 

    <Test> 
    <TestPhase>2</TestPhase> 
    <TestFlow>4</TestFlow> 
    <TestParameter>6</TestParameter> 
    </Test> 

    <Test> 
    <TestPhase>2</TestPhase> 
    <TestFlow>4</TestFlow> 
    <TestParameter>1</TestParameter> 
    </Test> 

    <Test> 
    <TestPhase>2</TestPhase> 
    <TestFlow>2</TestFlow> 
    <TestParameter>10</TestParameter> 
    </Test> 

    <Test> 
    <TestPhase>2</TestPhase> 
    <TestFlow>2</TestFlow> 
    <TestParameter>1</TestParameter> 
    </Test> 
    . 
    . 
    . 
    . 
    . 
    </Root> 

3級排序後,我做了一個副本。但新的XML(test.xml)似乎如下:

<Test><TestPhase>3</TestPhase><TestFlow>2</TestFlow><TestParameter>1</TestParameter></Test><Test><TestPhase>3</TestPhase><TestFlow>2</TestFlow><TestParameter>2</TestParameter></Test><Test><TestPhase>4</TestPhase><TestFlow>1</TestFlow><TestParameter>1</TestParameter></Test><Test><TestPhase>4</TestPhase><TestFlow>1</TestFlow><TestParameter>2</TestParameter></Test><Test><TestPhase>4</TestPhase><TestFlow>2</TestFlow><TestParameter>1</TestParameter></Test><Test><TestPhase>4</TestPhase><TestFlow>2</TestFlow><TestParameter>2</TestParameter></Test><Test><TestPhase>5</TestPhase><TestFlow>1</TestFlow><TestParameter>1</TestParameter></Test><Test><TestPhase>5</TestPhase><TestFlow>1</TestFlow><TestParameter>2</TestParameter></Test><Test><TestPhase>5</TestPhase><TestFlow>2</TestFlow><TestParameter>1</TestParameter></Test><Test><TestPhase>5</TestPhase><TestFlow>2</TestFlow><TestParameter>2</TestParameter></Test><Test><TestPhase>6</TestPhase><TestFlow>1</TestFlow><TestParameter>1</TestParameter></Test><Test><TestPhase>6</TestPhase><TestFlow>1</TestFlow><TestParameter>2</TestParameter></Test><Test><TestPhase>6</TestPhase><TestFlow>2</TestFlow><TestParameter>1</TestParameter></Test><Test><TestPhase>6</TestPhase><TestFlow>2</TestFlow><TestParameter>2</TestParameter></Test><Test><TestPhase>7</TestPhase><TestFlow>1</TestFlow><TestParameter>1</TestParameter></Test><Test><TestPhase>7</TestPhase><TestFlow>1</TestFlow><TestParameter>2</TestParameter></Test><Test><TestPhase>7</TestPhase><TestFlow>2</TestFlow><TestParameter>1</TestParameter></Test><Test>< . 
    . 
    . 
    . 
    . 

請在此建議我。我是XPath/XSLT的新手。我的XSLT寫成如下:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

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

    <xsl:template match="Root"> 
    <xsl:apply-templates> 
     <xsl:sort select="TestPhase" data-type="number" order="ascending"/> 
     <xsl:sort select="TestFlow" data-type="number" order="ascending"/> 
     <xsl:sort select="TestParameter" data-type="number" order="ascending"/> 
    </xsl:apply-templates> 
    </xsl:template> 


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

</xsl:stylesheet> 

我還檢查我的代碼,只是複製原始XML的方法,沒有對它進行排序。發生同樣的問題。我嘗試用下面的XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

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

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

</xsl:stylesheet> 

字:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
雖然我使用

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

它是所有

沒有在第一行出現崩潰了athough我選擇:

indent="yes" 

請幫忙。非常感激你的幫助。

謝謝。

Cheers :)

+0

您是如何實際執行XSLT轉換的?你在使用什麼XSLT處理器?請注意,縮進(或缺少)實際上並不是由XSLT過程本身完成的,而是通過將結果序列化爲字符串。 –

回答

0

首先,您所指的「單詞」是xml聲明。把它列入你的輸出,你應該加上「省略XML的聲明」的聲明xsl:output(與「獨立」沿,如果你想包括在申報)

<xsl:output method="xml" indent="yes" omit-xml-declaration="no" standalone="yes" /> 

然而,這最初是行不通的因爲要使輸出的XML文檔獨立,它必須是良構的,並且只有一個根元素。您當前的模板匹配Root未複製該元素。

此外,通過做xsl:apply-templates您選擇的所有子節點Root,但包括空白節點,而不僅僅是Test元素。爲了解決這個問題,你可以通過做<xsl:apply-templates select="Test">明確地選擇Test元素。或者,您可以通過將<xsl:strip-space elements="*" />添加到XSLT中,從XML中刪除只包含空白的節點。

試試這個XSLT,例如:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="xml" indent="yes" omit-xml-declaration="no" standalone="yes" /> 

    <xsl:template match="Root"> 
    <xsl:copy> 
    <xsl:apply-templates select="Test"> 
     <xsl:sort select="TestPhase" data-type="number" order="ascending"/> 
     <xsl:sort select="TestFlow" data-type="number" order="ascending"/> 
     <xsl:sort select="TestParameter" data-type="number" order="ascending"/> 
    </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

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

</xsl:stylesheet> 

至於實際的結果不被縮進,這取決於如何變換的結果被序列化。如果你正在使用C#(我根據你問的前一個問題做了這個假設),你可能需要檢查你是否將xslt輸出設置傳遞給了XmlWriter。請參見https://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.outputsettings(v=vs.110).aspx,它給出了此示例:

XslCompiledTransform xslt = new XslCompiledTransform(); 
xslt.Load(stylesheet); 
XPathDocument doc = new XPathDocument(filename); 
XmlWriter writer = XmlWriter.Create(Console.Out, xslt.OutputSettings); 
xslt.Transform(doc, writer); 
writer.Close(); 
+0

非常感謝Tim C.我終於可以使用縮進的文檔元素和聲明來生成我的XML。然而,仍然存在一個小缺陷,即使我遵循你的方法,獨立=「是」不存在。但是,非常非常感謝你,來自newbuntu的Tim C. Cheers! – newbuntu