如何使用saxon s9api以编程方式向节点添加属性?

时间:2017-09-19 08:57:35

标签: xml xslt saxon

我正在尝试生成多个具有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();
     }

1 个答案:

答案 0 :(得分:1)

MutableNodeInfo中的更新接口是为XQuery Update功能而设计的:技术上没有任何东西可以阻止它们直接从Java应用程序中使用,但它们并非专为可用性而设计,并且它们没有经过独立于XQuery的测试更新,因此如果以非预期或不受支持的方式使用,它们可能会崩溃。

您可以访问NamePool作为Processor.getUnderlyingConfiguration()。getNamePool()。

我认为您可能会发现使用FingerprintedQName作为NodeName实现更方便,那么您不必担心指纹和NamePool。