простая проблема сортировки XSL - PullRequest
0 голосов
/ 29 июня 2010

Я пытаюсь отсортировать xml, используя xsl. Получил образец с 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>

Ниже приведен 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();

1 Ответ

0 голосов
/ 29 июня 2010

Вы сортируете на неправильном уровне. Если вы хотите отсортировать документы, вам нужен шаблон, который соответствует <Directory> и содержит apply-templates с сортировкой.

Если все, что вы делаете, это копируете входные данные в выходные данные с сортировкой, выполните поиск в Google по запросу «xsl identity transform» и добавьте шаблон, соответствующий «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>

В точке, где вы сопоставили Directory, и внутри apply-templates узел контекста является каждым Document по очереди. Так что сортировка должна быть просто @Name.

Подробное объяснение:

  1. Первый шаблон - это «шаблон идентификации» (запомните эту форму, вы будете часто ее использовать).
  2. Второй шаблон специализируется на обработке только для узлов «Каталог».
    • Первый apply-templates копирует любые атрибуты
    • Второй apply-templates копирует дочерние узлы после сортировки
    • Оба эти шаблона неявно повторно используют шаблон преобразования идентификаторов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...