2017-09-19 5 views
0

J'essaie de générer plusieurs pages html statiques ayant un fichier xml et une transformation xsl. J'ai utilisé un itérateur pour faire une transformation pour chaque page html.Comment ajouter un attribut à un nœud avec saxon s9api?

Je voudrais modifier un nœud et ajouter un attribut. J'ai vu quelques exemples et j'ai écrit le code ci-dessous mais je ne sais pas comment récupérer NamePool, le s9api doit être changé car le "getNamePool()" n'est pas listé dans NodeInfo ou MutableNodeInfo.

Comment puis-je ajouter un attribut au noeud correctement et comment puis-je récupérer 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(); 
    } 

Répondre

1

Les interfaces de mise à jour à MutableNodeInfo sont conçus pour être utilisés par la fonction de mise à jour XQuery: il n'y a rien sur le plan technique les empêchant d'être utilisés directement à partir d'une application Java, mais ils ne sont pas conçus pour la facilité d'utilisation, et ils n'ont pas été testés indépendamment de la mise à jour de XQuery, ils peuvent donc tomber en panne s'ils sont utilisés de manière inattendue ou non supportée.

Vous pouvez accéder au NamePool en tant que Processor.getUnderlyingConfiguration(). GetNamePool().

Je pense que vous trouverez probablement plus pratique d'utiliser FingerprintedQName comme implémentation de NodeName, alors vous n'avez pas besoin de vous soucier des empreintes digitales et du NamePool.

+0

Merci Michael, j'ai essayé FingerprintedQName mais sur le temps de construction j'ai: net.sf.saxon.tree.tiny.TinyElementImpl ne peut pas être converti en net.sf.saxon.om.MutableNodeInfo. Que manque-t-il pour ajouter correctement un attribut? – Tvori