在本文中,您将会了解到关于Java中的Saxon:用于CSV到XML的XSLT的新资讯,同时我们还将为您解释javasax解析xml的相关在本文中,我们将带你探索Java中的Saxon:用于CSV到X
在本文中,您将会了解到关于Java中的Saxon:用于CSV到XML的XSLT的新资讯,同时我们还将为您解释java sax解析xml的相关在本文中,我们将带你探索Java中的Saxon:用于CSV到XML的XSLT的奥秘,分析java sax解析xml的特点,并给出一些关于c# – 从Saxon 9.4he中的嵌入资源加载xml和xslt、csv到java中的pdf文件、html – 用于表格化XML的通用XSLT、IE9 中如何解析 XML 和 XSLT,並通過 XSLT 將 XML 轉換成 HTML?的实用技巧。
本文目录一览:- Java中的Saxon:用于CSV到XML的XSLT(java sax解析xml)
- c# – 从Saxon 9.4he中的嵌入资源加载xml和xslt
- csv到java中的pdf文件
- html – 用于表格化XML的通用XSLT
- IE9 中如何解析 XML 和 XSLT,並通過 XSLT 將 XML 轉換成 HTML?
Java中的Saxon:用于CSV到XML的XSLT(java sax解析xml)
我从这里获得了XSLT:http : //andrewjwelch.com/code/xslt/csv/csv-to-
xml_v2.html
并将CSV文件转换为XML文档。在命令行上与以下命令一起使用时,它将执行此操作:
java -jar saxon9he.jar -xsl:csv-to-xml.csv -it:main -o:output.xml
现在,问题变成了: 如何在Java代码中执行此操作?
现在我有如下代码:
TransformerFactory transformerFactory = TransformerFactory.newInstance();StreamSource xsltSource = new StreamSource(new File("location/of/csv-to-xml.xsl"));Transformer transformer = transformerFactory.newTransformer(xsltSource);StringWriter stringWriter = new StringWriter();transformer.transform(documentSource, new StreamResult(stringWriter));String transformedDocument = stringWriter.toString().trim();
(Transformer
是的实例net.sf.saxon.Controller
。)
命令行上的技巧是指定“ -it:main”指向XSLT中的命名模板。这意味着您不必为源文件提供“ -s”标志。
问题再次从Java端开始。我在哪里/如何指定此“
-it:main”?这样会不会破坏其他不需要指定的XSLT?我是否必须将每个XSLT文件中的每个模板都命名为“
main”?给定Transformer.transform()的方法签名,我 必须 指定源文件,所以这不会破坏我在弄清楚该问题上所取得的所有进步吗?
编辑: 如果有人在寻找,我发现s9api隐藏在saxon9he.jar内。
答案1
小编典典您正在使用为XSLT 1.0设计的JAXP API。如果要使用XSLT
2.0功能,例如在命名模板上启动转换的功能,我建议您改用s9api接口,它为此目的而设计得更好。
但是,如果您有很多现有的JAXP代码并且不想重写它,通常可以通过将JAXP对象向下转换为基础的Saxon实现类来实现所需的功能。例如,您可以将JAXP
Transformer转换为net.sf.saxon.Controller,从而可以访问controller.setInitialTemplate();。涉及到调用transform()方法时,只需提供null作为Source参数。
顺便说一句,如果您正在编写需要2.0处理器的代码,那么我不会使用TransformerFactory.newInstance(),它将为您提供它在类路径中找到的任何旧XSLT处理器。请改用新的net.sf.saxon.TransformerFactoryImpl(),它的(a)功能更强大,(b)更快。
c# – 从Saxon 9.4he中的嵌入资源加载xml和xslt
我使用Saxon 9.4家庭版(Saxon-HE 9.4 .NET)来获得对XSLT 2.0和XPath 2.0以及.NET中的XQuery 1.0的支持.当我加载没有URI的文件时,我的代码崩溃了.
>是否可以在没有与加载的文档相关的URI的情况下加载xml / xsl文档?
>如果没有,有没有办法为嵌入在dll文件中的元素定义URI?
任何其他解决方案也将受到赞赏,我唯一的术语是必须从dll文件中加载文件.
只要我从文件加载xml / xsl,我的代码就可以正常工作:
const string sourcePath = @"C:\test\TestInvoiceWithError.xml";
const string xsltpath = @"C:\test\UBL-T10-BiiRules.xsl";
当我尝试从嵌入式资源加载时,代码抛出一个异常,指出“没有提供基本URI”:
Stream sourceStream = GetEmbeddedResource("TestProject1.testfiles.TestInvoice.xml");
Stream xsltStream = GetEmbeddedResource("TestProject1.testfiles.UBL-T10-BiiRules.xsl");
我还为具有相对路径的资源创建了Uri,这会引发异常“相对URI不支持此操作.”:
Uri sourceUri = new Uri("/TestProject1;component/testfiles/TestInvoice.xml", UriKind.Relative);
Uri xsltUri = new Uri("/TestProject1;component/testfiles/UBL-T10-BiiRules.xsl.xml", UriKind.Relative);
这是我的代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;
using System.Xml;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Saxon.Api;
namespace TestProject1
{
[TestClass]
public class XsltTest
{
[TestMethod]
public void Saxontest()
{
Stream sourceStream = GetEmbeddedResource("TestProject1.testfiles.TestInvoice.xml");
Stream xsltStream = GetEmbeddedResource("TestProject1.testfiles.UBL-T10-BiiRules.xsl");
Uri sourceUri = new Uri("/TestProject1;component/testfiles/TestInvoice.xml", UriKind.Relative);
Uri xsltUri = new Uri("/TestProject1;component/testfiles/UBL-T10-BiiRules.xsl.xml", UriKind.Relative);
const string sourcePath = @"C:\test\TestInvoiceWithError.xml";
const string xsltpath = @"C:\test\UBL-T10-BiiRules.xsl";
Processor processor = new Processor();
XdmNode input = processor.NewDocumentBuilder().Build(new Uri(sourcePath));
XsltTransformer transformer = processor.NewXsltCompiler().Compile(new Uri(xsltpath)).Load();
transformer.InitialContextNode = input;
Serializer serializer = new Serializer();
StringBuilder sb = new StringBuilder();
TextWriter writer = new StringWriter(sb);
serializer.SetoutputWriter(writer);
transformer.Run(serializer);
XmlDocument xmlDocOut = new XmlDocument();
xmlDocOut.LoadXml(sb.ToString());
XmlNodeList FailedAsserts = xmlDocOut.SelectNodes("/svrl:schematron-output/svrl:Failed-assert",XmlInvoiceNamespaceManager());
if (FailedAsserts == null)
return;
foreach (XmlNode FailedAssert in FailedAsserts)
{
if (FailedAssert.Attributes == null)
continue;
XmlAttribute typeOfError = FailedAssert.Attributes["flag"];
if (typeOfError.Value.Equals("warning"))
{/*Log something*/}
else if (typeOfError.Value.Equals("fatal"))
{/*Log something*/}
}
}
private XmlNamespaceManager XmlInvoiceNamespaceManager()
{
IDictionary<string, string> list = new Dictionary<string, string>
{
{"xml", "http://www.w3.org/XML/1998/namespace"},
{"xsi", "http://www.w3.org/2001/XMLSchema-instance"},
{"xsd", "http://www.w3.org/2001/XMLSchema"},
{"udt","urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"},
{"qdt","urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"},
{"ext","urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"},
{"ccts", "urn:un:unece:uncefact:documentation:2"},
{"cbc","urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"},
{"cac","urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"},
{"inv", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"},
{"svrl", "http://purl.oclc.org/dsdl/svrl"}
};
XmlNaMetable xmlNaMetable = new NaMetable();
XmlNamespaceManager xmlInvoiceNamespaceManager = new XmlNamespaceManager(xmlNaMetable);
foreach (keyvaluePair<string, string> ns in list)
{
xmlInvoiceNamespaceManager.AddNamespace(ns.Key, ns.Value);
}
return xmlInvoiceNamespaceManager;
}
protected static Stream GetEmbeddedResource(string path)
{
Assembly asm = Assembly.GetExecutingAssembly();
Stream stream = asm.GetManifestResourceStream(path);
return stream;
}
}
}
解决方法:
我认为您可以使用Saxon从流加载,但您需要首先设置一个基本URI,以允许加载任何引用资源(如XML文档中的DTD或类似包含或导入的样式表模块).如果您确定没有,那么只需尝试例如
DocumentBuilder db = processor.NewDocumentBuilder();
db.BaseUri = new Uri("file:///C:/");
XdmNode input = db.Build(xsltStream);
显然,如果您需要在XSLT中解析也要作为嵌入式资源加载的相对URI,则需要更多工作:您需要将XmlResolver设置为支持从嵌入式资源加载资源的类,以及XSLT中的URI,用于向解析程序指示您需要从资源加载.我不认为.NET框架提供了这种类型的XmlResolver,并且Uri类也不支持自定义模式.
csv到java中的pdf文件
我的问题是这个代码在pdf中结束的文件切断了csv文件的第一行,我无法弄清楚原因. [附例]基本上我想要一个没有被操纵的cfv文件的pdf版本.我确定这是一个问题,我如何将数据添加到itext pdf但我真的找不到另一种方法将数组转发到pdf文件.有关修复代码或更简单的任何想法?
public static void main(String[] args) throws IOException,DocumentException { @SuppressWarnings("resource") CSVReader reader = new CSVReader(new FileReader("data1.csv"),'\''); String [] nextLine; while ((nextLine = reader.readNext()) != null) { // nextLine[] is an array of values from the line System.out.println(nextLine[0]); String test; test = nextLine[0]; // step 1 Document document = new Document(); // step 2 PdfWriter.getInstance(document,new FileOutputStream("Test.pdf")); // step 3 document.open(); // step 4 PdfPTable arrayTable3 = new PdfPTable(1); arrayTable3.setHorizontalAlignment(Element.ALIGN_LEFT); Phrase phrase1 = new Phrase(nextLine[0]); PdfPCell arrayDetailsCell3 = new PdfPCell(); arrayDetailsCell3.addElement(phrase1); // Add the cell to the table arrayTable3.addCell(arrayDetailsCell3); // Add table to the document document.add(arrayTable3); // step 5 document.close(); } }
CSV文件:http://dl.dropbox.com/u/11365830/data1.csv
PDF文件:http://dl.dropbox.com/u/11365830/Test.pdf
解决方法
html – 用于表格化XML的通用XSLT
例如.
<root> <Field1>value1</Field1> <Field2>value2</Field2> <Field3>value3</Field3> </root>
输出应如下所示:
<table> <tr> <td>Field1</td> <td>value1</td> </tr> <tr> <td>Field2</td> <td>value2</td> </tr> <tr> <td>Field3</td> <td>value3</td> </tr> </table>
我想避免在XSLT代码中使用xml标记名称,以使其足够通用.不确定这是否可行.
任何想法如何去做?
解决方法
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <table> <xsl:apply-templates/> </table> </xsl:template> <xsl:template match="*"> <tr> <td> <p><xsl:value-of select="name()"/></p> </td> <td> <p><xsl:value-of select="."/></p> </td> </tr> </xsl:template> <xsl:template match="*[*]"> <tr> <td> <p><xsl:value-of select="name()"/></p> </td> <td> <table> <xsl:apply-templates/> </table> </td> </tr> </xsl:template> </xsl:stylesheet>
我并没有尝试用混合内容做任何非常聪明的事情.
IE9 中如何解析 XML 和 XSLT,並通過 XSLT 將 XML 轉換成 HTML?
以下為我在網上找的方法,但是好像是不行的
var xstt = new ActiveXObject("Msxml2.XSLTemplate"); var xmlDoc = new ActiveXObject("Msxml2.DOMDocument"); var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument"); xmlDoc.loadXML(xml); xslDoc.loadXML(xslt); xstt.stylesheet = xslDoc; var xslProc = xstt.createProcessor(); xslProc.input = xmlDoc; xslProc.transform(); target.html(xslProc.output);
今天的关于Java中的Saxon:用于CSV到XML的XSLT和java sax解析xml的分享已经结束,谢谢您的关注,如果想了解更多关于c# – 从Saxon 9.4he中的嵌入资源加载xml和xslt、csv到java中的pdf文件、html – 用于表格化XML的通用XSLT、IE9 中如何解析 XML 和 XSLT,並通過 XSLT 將 XML 轉換成 HTML?的相关知识,请在本站进行查询。
本文标签: