func (context *ExecutionContext) EvalXPathAsNodeset(xmlNode xml.Node, data interface{}) (result xml.Nodeset, err error) { _, err = context.EvalXPath(xmlNode, data) if err != nil { return nil, err } nodePtrs, err := context.XPathContext.ResultAsNodeset() if err != nil { return nil, err } var output xml.Nodeset for _, nodePtr := range nodePtrs { output = append(output, xml.NewNode(nodePtr, xmlNode.MyDocument())) } result = output return }
func (context *ExecutionContext) EvalXPath(xmlNode xml.Node, data interface{}) (result interface{}, err error) { switch data := data.(type) { case string: if xpathExpr := xpath.Compile(data); xpathExpr != nil { defer xpathExpr.Free() result, err = context.EvalXPath(xmlNode, xpathExpr) } else { err = errors.New("cannot compile xpath: " + data) } case []byte: result, err = context.EvalXPath(xmlNode, string(data)) case *xpath.Expression: xpathCtx := context.XPathContext xpathCtx.SetResolver(context) err := xpathCtx.Evaluate(xmlNode.NodePtr(), data) if err != nil { return nil, err } rt := xpathCtx.ReturnType() switch rt { case xpath.XPATH_NODESET, xpath.XPATH_XSLT_TREE: nodePtrs, err := xpathCtx.ResultAsNodeset() if err != nil { return nil, err } var output []xml.Node for _, nodePtr := range nodePtrs { output = append(output, xml.NewNode(nodePtr, xmlNode.MyDocument())) } result = output case xpath.XPATH_NUMBER: result, err = xpathCtx.ResultAsNumber() case xpath.XPATH_BOOLEAN: result, err = xpathCtx.ResultAsBoolean() default: result, err = xpathCtx.ResultAsString() } default: err = errors.New("Strange type passed to ExecutionContext.EvalXPath") } return }