我正在尝试生成多个具有xml文件和xsl转换的静态html页面。我使用迭代器为每个html页面进行转换。
我想修改一个Node并添加一个属性。我看了一些例子并编写了下面的代码,但我不知道如何检索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();
}
答案 0 :(得分:1)
MutableNodeInfo中的更新接口是为XQuery Update功能而设计的:技术上没有任何东西可以阻止它们直接从Java应用程序中使用,但它们并非专为可用性而设计,并且它们没有经过独立于XQuery的测试更新,因此如果以非预期或不受支持的方式使用,它们可能会崩溃。
您可以访问NamePool作为Processor.getUnderlyingConfiguration()。getNamePool()。
我认为您可能会发现使用FingerprintedQName作为NodeName实现更方便,那么您不必担心指纹和NamePool。