Transormacja xsl do html,rtf

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-us/library/aa537151%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/downloads/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en bo nie znalazłem, a nie chcę specjalnie instalować też .NET20

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.

0

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

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>

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