我正在尝试生成具有xml文件和xsl转换的多个静态html页面。我使用迭代器对每个html页面进行转换。
我想修改一个节点并添加一个属性。我看到了一些例子,并写了下面的代码,但我不知道如何检索NamePool,s9api必须更改,因为"getNamePool()“没有在NodeInfo或MutableNodeInfo中列出。
如何正确地向节点添加属性以及如何检索NamePool?
Processor processor = new Processor(false);
XsltCompiler compiler = processor.newXsltCompiler();
XsltTransformer transformer = compiler.compile(new StreamSource(new File(xlsFilePath))).load();
XdmNode source = processor.newDocumentBuilder().build(new StreamSource(new File(xmlFilePath)));
XdmValue xdmValue = processor.newXPathCompiler().evaluate(xpathExpression, source);
for (XdmItem xdmItem : xdmValue) {
XdmNode xdmNode = (XdmNode)xdmItem;
MutableNodeInfo node = (MutableNodeInfo)xdmNode.getUnderlyingNode();
NodeInfo nodeInfo = (NodeInfo)xdmNode.getUnderlyingNode().;
NamePool namePool = ...//retrieve namePoll
CodedName codedName = new CodedName(node.getFingerprint(), node.getPrefix(), namePool);
node.addAttribute(codedName, BuiltInAtomicType.UNTYPED_ATOMIC, "1", 0);
Serializer out = processor.newSerializer(new File(outputFolderPath + xdmNode.getAttributeValue(new QName("id")) +".html"));
out.setOutputProperty(Serializer.Property.METHOD, "html");
out.setOutputProperty(Serializer.Property.INDENT, "yes");
out.setOutputProperty(Serializer.Property.VERSION, "5");
transformer.setInitialContextNode(xdmNode);
transformer.setDestination(out);
transformer.transform();
}发布于 2017-09-19 19:32:05
MutableNodeInfo中的更新接口是为XQuery更新特性而设计的:从技术上讲,没有什么可以阻止直接在XQuery应用程序中使用它们,但是它们不是为可用性而设计的,并且它们没有独立于Java进行测试,所以如果以意外或不受支持的方式使用它们,它们可能会崩溃。
您可以作为Processor.getUnderlyingConfiguration().getNamePool().访问NamePool
我想您可能会发现使用FingerprintedQName作为NodeName实现会更方便,这样就不需要担心指纹和NamePool了。
https://stackoverflow.com/questions/46296084
复制相似问题