// ApplyMods changes a SAML message by applying an array of xpath expressions and a value // If the value is "" the nodes are unlinked // if the value starts with "+ " the the node content is prefixed with the rest of the value // Otherwise the node content is replaced with the value func ApplyMods(xp *gosaml.Xp, m mods) { //log.Printf("%+v\n", m) //log.Println(xp.X2s()) for _, change := range m { if change.value == "" { //log.Printf("changeval: '%s'\n", change.value) for _, element := range xp.Query(nil, change.path) { //log.Printf("unlink: %s\n", change.path) xp.UnlinkNode(element) } } else if strings.HasPrefix(change.value, "+ ") { for _, element := range xp.Query(nil, change.path) { value := xp.NodeGetContent(element) xp.NodeSetContent(element, strings.Fields(change.value)[1]+value) } } else { xp.QueryDashP(nil, change.path, change.value, nil) } } //log.Println(xp.X2s()) }