2010-06-29 3 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 샘플에서 알 수 있듯이 위의 match 및 select 태그를 사용하여 태그의 전체 계층 구조를 지정해 보았습니다.

<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"에 대한 Google 검색을 수행하고 "디렉토리"와 일치하는 템플릿을 추가하십시오.

다음은 Directory 일치 한 시점에서 해결책

<?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> 

, 그리고 apply-templates 내부 컨텍스트 노드는 차례로 각 Document입니다. 따라서 정렬은 단지 @Name 일 필요가 있습니다.

상세 설명 :

  1. 첫 번째 템플릿은 '정체성 템플릿'이다 (이 양식을 암기, 당신은 그것을 많이 사용합니다).
  2. 두 번째 템플릿은 "디렉토리"노드에 대한 처리 만 전문화합니다.
    • 첫 번째 apply-templates 사본 어떤 속성이 템플릿의
    • 모두를 정렬 한 후
    • 두 번째 apply-templates 복사 자식 노드는 암시 적으로
+0

댓글이 형식화하는 옵션이없는 템플릿을 변환 정체성을 다시 사용합니다. 그러므로 대답으로 게시하시기 바랍니다 위의 내 게시물을 참조하십시오. – user376250

+0

Jim에게 자세한 설명을 해주셔서 감사드립니다. 마지막 게시물에서 언급했을 때 정체성 변환에 대해 배웠습니다. 문제를 먼저 해결하고 최적화를 시도하기 때문에 적용하지 않았습니다. 사용 된 xsl 출력은 여전히 ​​동일합니다. 변환을 적용하는 동안 나는 잘못된 일을하고 있습니까? 질문 본문에 코드를 추가했습니다. – user376250

+0

금이갔습니다. 그것은 코드에서 어리석은 실수였습니다. 모든 도움과 지원에 다시 한 번 감사드립니다. – user376250