项目用到了xsl,但是这个项目已经是几百个人经历了10年的垃圾般的工程,这些个xsl里的相互引用盘根错杂,想使用eclipse的xml编辑器快速定位一些变量和模板,经过了两天的摸索发现我错了.
Eclipse的xml编辑器使用的相对目录定位resource,结果项目的xsl全部使用的无根目录(通过项目内部的自定义xml扩展定位容器的目录再结合resource路径定位).
我承认这帮人xml处理很牛,但是他们不提供源码.所以通过代码把里面的无根路径改成了相对目录
工具类
package com.tr.longlh; import java.net.URL; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class Util { public Document parse(URL url) throws DocumentException { SAXReader reader = new SAXReader(); Document document = reader.read(url); return document; } public Document parse(String path) throws DocumentException { SAXReader reader = new SAXReader(); Document document = reader.read(path); return document; } public void findLinks(Document document) throws DocumentException { List<Node> list = document.selectNodes("//a/@href"); for (Iterator<Node> iter = list.iterator(); iter.hasNext();) { Attribute attribute = (Attribute) iter.next(); String url = attribute.getValue(); } } public void treeWalk(Document document) { treeWalk(document.getRootElement()); } public void treeWalk(Element element) { for (int i = 0, size = element.nodeCount(); i < size; i++) { Node node = element.node(i); if (node instanceof Element) { treeWalk((Element) node); } else { // do something… } } } public void barbar(Document document) { List<Node> list = document.selectNodes("//foo/bar"); Node node = document.selectSingleNode("//foo/bar/author"); String name = node.valueOf("@name"); } public void bar(Document document) throws DocumentException { Element root = document.getRootElement(); // iterate through child elements of root for (Iterator<Element> it = root.elementIterator(); it.hasNext();) { Element element = it.next(); // do something } // iterate through child elements of root with element name "foo" for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) { Element foo = it.next(); // do something } // iterate through attributes of root for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) { Attribute attribute = it.next(); // do something } } public Document createDocument() { Document document = DocumentHelper.createDocument(); Element root = document.addElement("root"); Element author1 = root.addElement("author").addAttribute("name", "James").addAttribute("location", "UK") .addText("James Strachan"); Element author2 = root.addElement("author").addAttribute("name", "Bob").addAttribute("location", "US") .addText("Bob McWhirter"); return document; } // { // Document document = null; // FileWriter out; // try { // out = new FileWriter("foo.xml"); // document.write(out); // } catch (IOException e) { // e.printStackTrace(); // } // } public void prettyPrint(Document document) { // lets write to a file try { // FileWriter fileWriter = new FileWriter("output.xml"); // XMLWriter writer = new XMLWriter(fileWriter); // writer.write(document); // writer.close(); // Pretty print the document to System.out OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(System.out, format); writer.write(document); // Compact format to System.out format = OutputFormat.createCompactFormat(); writer = new XMLWriter(System.out, format); writer.write(document); } catch (Exception e) { e.printStackTrace(); } } }
XML修改处理类
package com.tr.longlh; import java.io.File; import java.io.FileWriter; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class XMLUtil extends Util { public Document parse(File f) throws DocumentException { SAXReader reader = new SAXReader(); reader.setValidation(false); reader.setIncludeInternalDTDDeclarations(true); reader.setIncludeExternalDTDDeclarations(true); Document document = reader.read(f); return document; } public void prettyWrite(String dir, String name, Document document) { try { File file = new File(dir, name); file.getParentFile().mkdirs(); if (file.getParentFile().exists()) { OutputFormat format = OutputFormat.createPrettyPrint(); FileWriter fileWriter = new FileWriter(file); XMLWriter writer = new XMLWriter(fileWriter, format); writer.write(document); writer.close(); } } catch (Exception e) { e.printStackTrace(); } } }
文件遍历
package com.tr.longlh; import java.io.File; import java.net.MalformedURLException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Supplier; import java.util.stream.Stream; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; public class XSLExtrenalResChangeMain extends XMLUtil { private static final String OUTPUT_DIR_REDNDING = "IBE"; private static final String INPUT_DIR_REDNDING = "E:\\work\\projects\\IBE\\xRez\\ibe"; public void dirWalkIBERendering() { File dir = new File(INPUT_DIR_REDNDING); dirWalk(dir, "rendering"); } public void dirWalk(File f, String folder) { if (f.isFile()) return; File[] listFiles = f.listFiles(); for (File file : listFiles) { if (file.isDirectory() && file.getName().equals(folder)) { // do xmlFilesWalk(file); } else { dirWalk(file, folder); } } } public void xmlFilesWalk(File f) { if (f.isFile()) return; File[] listFiles = f.listFiles(); for (File file : listFiles) { if (file.isDirectory()) { xmlFilesWalk(file); } if (file.getName().endsWith(".xsl")) { try { String pathTail = file.getPath().replace(INPUT_DIR_REDNDING, ""); String[] splitBySplash = pathTail.split("\\\\"); Document relativeDiretoryAddingDoc = doRelativeDiretoryAdding(file, splitBySplash.length-2); prettyPrint(relativeDiretoryAddingDoc); prettyWrite(OUTPUT_DIR_REDNDING, pathTail, relativeDiretoryAddingDoc); } catch (DocumentException e) { e.printStackTrace(); } } } } public Document doRelativeDiretoryAdding(File f, int splashCount) throws DocumentException { Stream<String> stream = Stream.generate(new Supplier<String>() { @Override public String get() { return "../"; } }).limit(splashCount); String directAdding = String.join("", stream.toArray(String[]::new)); Map<String, String> nsmap = new HashMap<String, String>(); nsmap.put("xsldoc", "http://www.bacman.net/XSLdoc"); nsmap.put("itemList", "http://xml.apache.org/xslt/java/com.openjawx.xRez.jsp.ItemListConfigBean"); nsmap.put("config", "http://xml.apache.org/xslt/java/com.openjawx.xRez.rendering.RenderingConfigBean"); nsmap.put("datalist", "http://xml.apache.org/xslt/java/com.openjawx.xRez.jsp.DataListConfigBean"); nsmap.put("ojd", "http://www.openjawtech.com/datalist"); nsmap.put("i18n", "http://xml.apache.org/xslt/java/com.openjawx.xRez.jsp.xRezLanguageConfigBean"); Document document = parse(f); // System.out.println(document.getRootElement().getNamespacePrefix()); // System.out.println(document.getRootElement().getNamespaceURI()); nsmap.put(document.getRootElement().getNamespacePrefix(), document.getRootElement().getNamespaceURI()); org.dom4j.XPath xImport = document.createXPath("//xsl:import/@href"); org.dom4j.XPath xInclude = document.createXPath("//xsl:include/@href"); xImport.setNamespaceURIs(nsmap); xInclude.setNamespaceURIs(nsmap); List<Node> xImports = xImport.selectNodes(document); for (Node node : xImports) { System.out.println(node.getStringValue()); node.setText(directAdding + node.getStringValue()); } List<Node> xIncludes = xInclude.selectNodes(document); for (Node node : xIncludes) { System.out.println(node.getStringValue()); node.setText(directAdding + node.getStringValue()); } return document; } public static void main(String[] args) throws MalformedURLException, DocumentException { XSLExtrenalResChangeMain extrenalResChangeMain = new XSLExtrenalResChangeMain(); extrenalResChangeMain.dirWalkIBERendering(); } }
相关推荐
`Document`对象是DOM4J中表示XML文档的核心对象,提供了多种方法来访问和修改XML数据。 #### DOM4J与XPath DOM4J的强大之处在于其对XPath的支持。XPath是一种在XML文档中查找信息的语言,通过XPath表达式可以精确...
DOM4J支持XSLT(Extensible Stylesheet Language Transformations),可以使用`SAXTransformerFactory`和`TransformerHandler`进行XSL转换。`XPath`接口可以用于在XSLT中选择源文档的节点。 **性能与效率** DOM4J...
DOM4J库提供了强大的XML解析和操作功能,如创建XML文档、查找XML元素、修改XML内容等。 5. **XPath和XSLT**: XPath是XML路径语言,用于在XML文档中查找信息。XSLT(XSL Transformations)则是一种转换XML文档的语言...
7. **扩展性**:DOM4J设计时考虑了扩展性,可以很容易地与其他Java库集成,如JAXB(Java Architecture for XML Binding)、XSLT(XSL Transformations)等。 ### 使用DOM4J的典型场景: 1. **XML数据的读取**:...
Java DOM4J是一个强大的、灵活的Java库,用于处理XML文档。它提供了全面的API来创建、修改和查询XML文档,使得在Java中操作XML变得简单。在这个“java dom4j 简单示例”中,我们将探讨如何在Spring框架的上下文中,...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单而直观的API,使得开发者可以方便地创建、解析、修改以及操作XML文档。在这个压缩包文件中,包含的示例应该详细展示了DOM4J在XML处理中的三个主要功能:...
DOM4J集成了Java的XSLT处理器,可以执行XSL样式表转换。通过`DocumentResult`和`TransformerFactory`,开发者可以轻松地将XML文档转换为另一种格式。 **6. 文档遍历** DOM4J的迭代器和访问器接口使遍历XML文档变得...
- XPath:DOM4J实现了XPath表达式引擎,允许通过简洁的路径表达式快速定位XML文档中的节点,提高了数据提取和处理的效率。 - XSLT:DOM4J支持XSL样式表转换,可以将XML文档转换成其他格式,如HTML或新的XML结构。 ...
- 支持 XSLT:DOM4J 可以执行 XSL 转换,方便地将 XML 数据转换为其他格式。 - 集成 Java 集合框架:DOM4J 结构与 Java 集合框架紧密集成,使得 XML 节点可以像处理普通 Java 对象一样操作。 2. **XML 文档操作...
DOM4J在处理大型XML文档时比DOM更高效,同时提供了丰富的API,使得XML操作更加灵活。 【XML与样式】 通过XSL(Extensible Stylesheet Language)可以实现XML内容与展现形式的分离。XSLT(XSL Transformation)用于...
DOM允许开发者通过遍历这棵树来访问和修改XML文档的任何部分,但因为整个文档都在内存中,处理大型XML时可能会消耗大量资源。 XSL(Extensible Stylesheet Language)是用来转换XML文档的,特别是XSLT(XSL ...
DOM解析允许程序动态访问和修改文档内容,例如查找、添加或删除元素。在"XML_3_文档解析工程-老师_上.rar"和"练习解析XML_自己.rar"中,你可能有机会学习到如何使用DOM解析器读取和操作XML数据。 "Schema教程.doc...
### XSL简明教程(5): 使用Order-by属性进行排序 在XML与XSL的世界里,数据处理变得异常灵活和强大。本章节我们将探讨如何利用XSL中的`order-by`属性来对XML文档进行排序,这在实际应用中非常有用,尤其是在需要根据...
### XSL基础教程知识点 #### 一、XSL与XML的关系 XSL(Extensible Stylesheet Language,可扩展样式表语言)是一种用于控制XML文档显示的标记语言。它主要用于将XML文档转换为其他格式,例如HTML或PDF。XSL允许...
在调用transform方法时,我们可以使用setParameter函数传递参数,这些参数可以在XSL模板中被引用,从而实现动态转换。 例如,假设我们有一个名为`contactsuseparm.xsl`的XSL样式表,它接受一个参数`contactType`来...
XSL(Extensible Stylesheet Language)是一种用于转换XML(Extensible Markup Language)文档的语言,它允许开发者通过定义样式表来控制XML数据的呈现方式。在XSL开发中,理解和掌握XSL函数、XSL元素以及XPath是至...
第一个XML文档 2.XSL入门 3.XSL模板与匹配模式 4.测试模式 5.XSL中的choose 6.运算符,关系与逻辑运算符,特殊字符等 7.XSL函数之一 8.脚本与XSL的结合及应用 9.XSL函数之二(DOM中对象的方法)
XSL-FO 简介 XSL-FO 的简介。包括其概念和作用。 XSL-FO 文档 本章将解 XSL-FO 文档的结构。 XSL-FO 区域 本章讲解 XSL-FO 的区域模型(area model)。 XSL-FO 输出 本章讲解 XSL-FO 文档的输出元素(Output ...