GVKun编程网logo

Java中的Saxon:用于CSV到XML的XSLT(java sax解析xml)

7

在本文中,您将会了解到关于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)

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

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文件

csv到java中的pdf文件

我试图将一个csv文件解析为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

解决方法

在CSVReader.java中将DEFAULT_SKIP_LInes设置为0

html – 用于表格化XML的通用XSLT

html – 用于表格化XML的通用XSLT

我正在创建一个XSLT,它足够通用,可以创建任何输入 XML数据的name-value表.

例如.

<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标记名称,以使其足够通用.不确定这是否可行.
 任何想法如何去做?

解决方法

以下是来自@ABach的解决方案的改进,它试图创建嵌套表:

<?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?

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的XSLTjava sax解析xml的分享已经结束,谢谢您的关注,如果想了解更多关于c# – 从Saxon 9.4he中的嵌入资源加载xml和xslt、csv到java中的pdf文件、html – 用于表格化XML的通用XSLT、IE9 中如何解析 XML 和 XSLT,並通過 XSLT 將 XML 轉換成 HTML?的相关知识,请在本站进行查询。

本文标签: