Transormacja xsl do html,rtf

Odpowiedz Nowy wątek
2015-01-29 21:26
0

Witam
Do transformacji html znalazłem kod

XslTransform xslt = new XslTransform();
xslt.Load(sXslPath);
XPathDocument xpath = new XPathDocument(sXmlPath);
XmlTextWriter xwriter = new XmlTextWriter(sXmlPath + ".html", Encoding.UTF8);
xslt.Transform(xpath, null, xwriter, null);
xwriter.Close();

a do rtf

DataSet ds;
XmlDataDocument xmlDoc;
XslCompiledTransform xslTran;
XmlElement root;
XPathNavigator nav;
XmlTextWriter writer;
ds = new DataSet();
ds.ReadXml(xml);
xmlDoc = new XmlDataDocument(ds);
xslTran = new XslCompiledTransform();
xslTran.Load(xsl);
root = xmlDoc.DocumentElement;
nav = root.CreateNavigator();
writer = new XmlTextWriter(xml+".rtf", System.Text.Encoding.Default);
xslTran.Transform(nav, writer);
writer.Close();

przykładowy xml

<?xml version="1.0" encoding="utf-8" ?>
<Employee>
  <Record> 
    <EmpID>E1</EmpID> 
    <EmpName>Sudipta</EmpName> 
    <EmpAge>29</EmpAge> 
    <EmpSex>M</EmpSex> 
    <EmpAddress>Kolkata</EmpAddress> 
    <Department> 
      <DeptID>D1</DeptID> 
      <EmpID>E1</EmpID> 
      <DeptName>Sales</DeptName> 
    </Department> 
  </Record>
</Employee>

i xsl

<?xml version="1.0" encoding="windows-1250"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format">

  <xsl:template match="/">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="prosta-strona"
    page-height="10cm" page-width="10cm"
    margin-top="1cm" margin-bottom="1cm"
    margin-left="1cm" margin-right="1cm">
      <fo:region-body/>
    </fo:simple-page-master>
  </fo:layout-master-set>

  <fo:page-sequence master-reference="prosta-strona">
    <fo:flow flow-name="xsl-region-body">
      <fo:block text-align="center" text-decoration="underline" space-after="1cm">
        <xsl:text>Przykład XSL-FO</xsl:text>
      </fo:block>
      <fo:block>
        <xsl:text>To jest banalny przykład XSL-FO.</xsl:text>
      </fo:block>
      <fo:block>
        <xsl:apply-templates />
      </fo:block>
    </fo:flow>
    </fo:page-sequence>
  </fo:root>
  </xsl:template>

  <xsl:template match="Employee">
    <!--Print Employee Records-->
    <xsl:text>Przykład XSL-FO</xsl:text>
    <xsl:apply-templates select="Record" />
  </xsl:template>
  <xsl:template match="Record">
    <fo:block text-align="center" text-decoration="underline" space-after="1cm">
      <xsl:value-of select="EmpName" />
    </fo:block>
    <xsl:value-of select="EmpAge" />
    <xsl:if test="EmpSex='M'">
      <xsl:text>Male</xsl:text>
    </xsl:if>
    <xsl:if test="EmpSex='F'">
      <xsl:text>Female</xsl:text>
    </xsl:if>
    <xsl:value-of select="EmpAddress" />
    <!--Print Employee Department-->
    <xsl:apply-templates select="Department" />
  </xsl:template>
  <xsl:template match="Department">
    <xsl:value-of select="DeptName" />
  </xsl:template>

</xsl:stylesheet>

kod do transformacji html nie generuje htmla tylko xmla, a kod do rtf tworzy plik tekstowy. Transformacja Rtf nie wstawia zawartości która jest poza <xsl:template ... czyli 'Przykład XSL-FO' nie jest wstawiony do pliku wynikowega, ale w transformacji html jest.
Co ciekawe podobne przykłady są podawane na stronach microsoftu np. https://msdn.microsoft.com/en[...]a537151%28v=office.11%29.aspx.
Jeden z przykładów jaki znalazłem zdumiał mnie bo wynika z niego że aby uzyskać htmla to w xsl muszę jawnie stosować jako tekst elementy htmlowe, a w rtfie formatowanie z tego typu.
No przecież jakbym chciał ręcznie każdy typ przygotowywać to po co mi transformacja.

Jak to jest z tą transformacją z xsl.
Czy ktoś może zaproponować jakieś darmowe sprawdzone na .NET4.0 biblioteki do Pdf, doc, docx. Kilka znalazłem ale niestety nic z tego nie wyszło. Czy jest na .NET40 http://www.microsoft.com/down[...]1DF206E0D0&displaylang=en bo nie znalazłem, a nie chcę specjalnie instalować też .NET20

Pozostało 580 znaków

2015-01-30 08:45
0

Jeżeli chcesz przedstawić xml w postaci graficznej, musisz opisać w jaki sposób ten xml ma być wyświetlany, ponieważ xml sam z siebie tego nie określa. XSL definiuje przekształcenie, jakie ma być dokonane na pliku xml, by otrzymać np. html. Możesz zrobić to samo za pomocą np. c#. Kod XSL podany przez Ciebie powyżej, nie transformuje xmla na html, tylko na xsl-fo.

edytowany 2x, ostatnio: ly000, 2015-01-30 08:46

Pozostało 580 znaków

2015-01-30 10:21
0

Czyli jak chcę dostać htmla to w xsl mam wpisać elementy htmlowe typu <html>, <body>,

Pozostało 580 znaków

2015-01-30 12:35
0
gbtbg napisał(a):

Czyli jak chcę dostać htmla to w xsl mam wpisać elementy htmlowe typu <html>, <body>,

Tak, lecz dla pdfa będziesz musiał użyć czegoś pośredniego (np. xsl-fo), a następnie użyć jakiegoś konwertera.

Tu jest przykładowy XSL, napisany przeze mnie, który wyświetla wszystkie nody i atrybuty w postaci html:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="text()">

            <xsl:value-of select="."/>

    </xsl:template>
    <xsl:template match="*">
        <xsl:param name="depth"/>
        <div>
            <span style="color: #3333f0">
                <xsl:value-of select="local-name()"/>
            </span>
            <small style="color: #337f33">
                <xsl:for-each select="@*">
                    &#160;<xsl:value-of select="name()"/>: <xsl:value-of select="."/>
                </xsl:for-each>
            </small>
            <div style="margin-left: 30px; background: rgba(0, 0, 0, 0.025)">
                <xsl:apply-templates/>
            </div>
        </div>
    </xsl:template>
</xsl:stylesheet>
edytowany 2x, ostatnio: ly000, 2015-01-30 12:37

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0