2010-06-29 39 views
0

我想使用xsl對xml進行排序。從xml.com得到了一些樣本。它看起來合乎邏輯和直觀。我試過了,有些它沒有排序。它很難讓我的頭在這附近。簡單的XSL排序問題

這裏是我使用排序

<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="SharePointSites"> 
    <xsl:copy> 
    <xsl:apply-templates> 
    <xsl:sort select="Document/@Name"/> 
    </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:copy> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 


</xsl:stylesheet> 

下面的XSL,是我想排序的XML。輸出也是一樣的。它不明顯缺少標籤層次結構。正如我從xml.com示例中瞭解的,我也嘗試使用上面的匹配和選擇標籤指定完整的標籤層次結構。

<SharePointSites> 

<Site Url="http://workspace.imperial.ac.uk/Activities/default.aspx" Name="Activities"> 

<Directory Name="Public"> 
<Document Url="http://workspace.imperial.ac.uk/Activities/Public/Imperial Activities Limited reg no etc.doc" Name="Imperial Activities Limited reg no etc.doc"/> 
<Document Url="http://workspace.imperial.ac.uk/Activities/Public/Property Enqiry Form.DOC" Name="Property Enqiry Form.DOC"/> 
<Document Url="http://workspace.imperial.ac.uk/Activities/Public/New Property Enquiry Form.doc" Name="New Property Enquiry Form.doc"/> 
<Document Url="http://workspace.imperial.ac.uk/Activities/Public/52 Princes Gardens.pdf" Name="52 Princes Gardens.pdf"/> 
<Document Url="http://workspace.imperial.ac.uk/Activities/Public/Silwood Web site Photo's.ppt" Name="Silwood Web site Photo's.ppt"/> 
<Document Url="http://workspace.imperial.ac.uk/Activities/Public/Service charge.pdf" Name="Service charge.pdf"/> 
<Document Url="http://workspace.imperial.ac.uk/Activities/Public/SPIP-G.pdf" Name="SPIP-G.pdf"/> 
<Document Url="http://workspace.imperial.ac.uk/Activities/Public/Silwood Business Park pictures.doc" Name="Silwood Business Park pictures.doc"/> 
</Directory> 
<Directory Name="Internal"/> 
</Site> 
</SharePointSites> 

outup仍然是一樣的。以下是我如何在XML文檔上應用轉換。

XslCompiledTransform myXslTrans = new XslCompiledTransform();

  //load the Xsl 
      myXslTrans.Load(@"C:\My code\dotNet Development\SharepointXML\WebService1\SharepointSiteContent.xslt");     

      //do the actual transform of Xml document 
      myXslTrans.Transform(aDoc, null, TransformedxmlWriter); 

      // Set to document 
      aTransforemdDoc.InnerXml = aTransformedStrbulider.ToString(); 

回答

0

您正在排錯級別。如果你想對文件進行分類,那麼你需要一個匹配<Directory>的模板,並且包含apply-templates

如果您所做的只是通過排序將輸入複製到輸出中,請執行谷歌搜索「xsl identity transform」並添加匹配「目錄」的模板。

這裏有一個解決方案

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Directory"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="node()"> 
     <xsl:sort select="@Name"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

在你到哪兒去匹配Directory點了,裏面apply-templates,上下文節點又各Document。所以排序需要只是@Name

詳細說明:

  1. 第一個模板是「身份模板」(記住這個表格,你會經常使用它)。
  2. 第二個模板專門處理「目錄」節點。
    • 第一apply-templates拷貝任何屬性
    • 第二apply-templates副本子節點排序
    • 這些模板的兩個後重新使用的身份變換模板隱
+0

評論沒有格式化選項。因此張貼作爲答覆,請參閱我的帖子上面。 – user376250 2010-06-29 16:17:40

+0

非常感謝Jim的詳細解釋。當您在上一篇文章中提到過時,我瞭解了身份轉換,並未將其應用,因爲我想先解決問題,然後嘗試優化它。使用你的xsl輸出仍然是一樣的。我在應用轉換時做錯了什麼?我已經添加了問題主體中的代碼。 – user376250 2010-06-30 10:09:20

+0

破解它。這是代碼中的一個愚蠢的錯誤。再次感謝所有的幫助和支持。 – user376250 2010-06-30 10:37:25