Преобразование XML в XML с использованием XSLT на основе XSD - PullRequest
1 голос
/ 14 октября 2011

Я использую XSLT / Xalan для преобразования одного файла XML в другой. При этом я обнаружил, что при создании таблицы стилей XSLT я жестко программировал узлы целевого файла, который я хотел сгенерировать. Это казалось странным.

Есть ли способ программно генерировать целевой файл с помощью XSD? Я хочу в основном создать каркас файла с помощью имеющегося у меня XSD, а затем запустить мою таблицу стилей для исходного файла. Затем я могу вставить найденные значения в соответствующие места в сгенерированном файле.

Есть ли способ сделать это? Или, возможно, XQuery предоставляет такую ​​функциональность вместо этого?

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Похоже, вы спрашиваете, как сериализовать DataSet и преобразовать его, используя XSLT.Если это так, вот как вы можете это сделать:

Сериализация набора данных в XML

DataTable table = new DataTable();     
System.IO.StringWriter writer = new System.IO.StringWriter(); 

//notice that we're ignoring the schema so we get clean XML back 
//you can change the write mode as needed to get your result 
table.WriteXml(writer, XmlWriteMode.IgnoreSchema, false); 

string dataTableXml = writer.ToString(); 

Что касается отображения его в читаемом формате, я бы предложил передатьXML в XSL-преобразователь, который затем можно использовать для анализа XML-кода и манипулирования выводом при необходимости.

Применение преобразования XSLT к DataSet

http://msdn.microsoft.com/en-us/library/8fd7xytc%28v=vs.71%29.aspx#Y289

Вот простой пример, который я создал, чтобы объяснить, как вы будете использовать XSL-преобразователь.Я не проверял его, но он должен быть довольно близок:

DataSet ds = new DataSet(); 
StringBuilder sbXslOutput = new StringBuilder();  

using (XmlWriter xslWriter = XmlWriter.Create(sbXslOutput)) 
{ 
    XslCompiledTransform transformer = new XslCompiledTransform(); 
    transformer.Load("transformer.xsl"); 
    XsltArgumentList args = new XsltArgumentList(); 

    transformer.Transform(new XmlDataDocument(ds), args, xslWriter); 
} 

string dataSetHtml = sbXslOutput.ToString(); 

Форматирование XML как HTML с использованием XSLT

Вот пример использования XSLT для преобразования XMLв таблицу HTML.Это должно быть довольно легко принять, чтобы вы могли использовать его с вашим сериализованным набором данных.

Допустим, это ваш набор данных, сериализованный в XML:

<RecentMatter>  
  <UserLogin>PSLTP6\RJK</UserLogin>  
  <MatterNumber>99999-2302</MatterNumber>  
  <ClientName>Test Matters</ClientName>  
  <MatterName>DP Test Matter</MatterName>  
  <ClientCode>99999</ClientCode>  
  <OfficeCode/>  
  <OfficeName/>  
  <Billable>true</Billable>  
  <ReferenceId/>  
  <LastUsed>2011-08-23T23:40:24.13+01:00</LastUsed>  
</RecentMatter>  
<RecentMatter>  
  <UserLogin>PSLTP6\RJK</UserLogin>  
  <MatterNumber>999991.0002</MatterNumber>  
  <ClientName>Lathe 1</ClientName>  
  <MatterName>LW Test 2</MatterName>  
  <ClientCode/>  
  <OfficeCode/>  
  <OfficeName/>  
  <Billable>true</Billable>  
  <ReferenceId/>  
  <LastUsed>2011-07-12T16:57:27.173+01:00</LastUsed>  
</RecentMatter>  
<RecentMatter>  
  <UserLogin>PSLTP6\RJK</UserLogin>  
  <MatterNumber>999991-0001</MatterNumber>  
  <ClientName>Lathe 1</ClientName>  
  <MatterName>LW Test 1</MatterName>  
  <ClientCode/>  
  <OfficeCode/>  
  <OfficeName/>  
  <Billable>false</Billable>  
  <ReferenceId/>  
  <LastUsed>2011-07-12T01:59:06.887+01:00</LastUsed>  
</RecentMatter>  
</NewDataSet>  

Вот сценарий XSLT, который преобразуетDataSet to HTML:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
  <xsl:template match="/"> 
      <table border="1"> 
        <tr> 
          <th>User Login</th> 
          <th>Matter Number</th> 
          ... 
        </tr> 
        <xsl:for-each select="NewDataSet/RecentMatter"> 
          <tr> 
            <td> 
              <xsl:value-of select="UserLogin"/> 
            </td> 
            <td> 
              <xsl:value-of select="MatterNumber"/> 
            </td> 
            ... 
          </tr> 
        </xsl:for-each> 
      </table> 
  </xsl:template> 
</xsl:stylesheet> 
0 голосов
/ 15 октября 2011

С XSLT 2.0 вы можете использовать информацию о схеме (как для исходного, так и для целевого документа), чтобы система могла проверять вашу таблицу стилей на корректность, давая вам предупреждения времени компиляции, если вы пытаетесь получить доступ к вводу или сгенерировать вывод, который будетнедопустимо в отношении схемы.Но я не знаю каких-либо инструментов, которые используют схему для автоматизации процесса создания таблицы стилей.Возможно, что некоторые из инструментов редактирования (IDE) XSLT используют информацию схемы, чтобы помочь с синтаксически-ориентированным редактированием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...