2010-06-29 43 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